Selaa lähdekoodia

support running code from files or stdin

without starting the server, making it usable as a cmdline tool.
Lucas Stadler 11 vuotta sitten
vanhempi
commit
29acea37f2
1 muutettua tiedostoa jossa 90 lisäystä ja 1 poistoa
  1. 90 1
      go/linguaevalia/linguaevalia.go

+ 90 - 1
go/linguaevalia/linguaevalia.go

@ -6,8 +6,10 @@ package main
6 6
7 7
import (
8 8
	"crypto/rand"
9
	"flag"
9 10
	"fmt"
10 11
	"html/template"
12
	"io"
11 13
	"io/ioutil"
12 14
	"log"
13 15
	"math/big"
@ -15,6 +17,7 @@ import (
15 17
	"os"
16 18
	"os/exec"
17 19
	"path"
20
	"strings"
18 21
)
19 22
20 23
type Language interface {
@ -138,7 +141,7 @@ func homePageHandler(w http.ResponseWriter, r *http.Request) {
138 141
139 142
var homePageTemplate = template.Must(template.New("homepage").Parse(homePageTemplateStr))
140 143
141
func main() {
144
func runServer() {
142 145
	addr, port := "localhost", 8000
143 146
	fmt.Printf("running on %s:%d\n", addr, port)
144 147
@ -157,6 +160,92 @@ func main() {
157 160
	}
158 161
}
159 162
163
func languageForExtension(extension string) *Language {
164
	var language *Language = nil
165
	for _, lang := range languageMappings {
166
		if "."+lang.Extension() == extension {
167
			return &lang
168
		}
169
	}
170
	return language
171
}
172
173
func runOnce(args []string) {
174
	var (
175
		f        *os.File
176
		err      error
177
		langName string = *language
178
	)
179
180
	if len(args) > 0 {
181
		if *language == "" {
182
			l := languageForExtension(path.Ext(args[0]))
183
			if l == nil {
184
				fmt.Printf("Error: Don't know how to handle '%s' files\n", path.Ext(args[0]))
185
				os.Exit(1)
186
			}
187
			langName = (*l).Name()
188
		}
189
		f, err = os.Open(args[0])
190
	} else {
191
		f, err = os.Stdin, nil
192
	}
193
	defer f.Close()
194
195
	if err != nil {
196
		fmt.Println("Error: ", err)
197
		os.Exit(1)
198
	}
199
200
	langName = strings.ToLower(langName)
201
	lang, ok := languageMappings[langName]
202
	if !ok {
203
		fmt.Printf("Error: Unknown language '%s'\n", langName)
204
		os.Exit(1)
205
	}
206
207
	if f == os.Stdin {
208
		f, err = tempFile("/tmp", "linguaevalia", lang.Extension())
209
		_, err = io.Copy(f, os.Stdin)
210
		if err != nil {
211
			fmt.Printf("Error: ", err)
212
			os.Exit(1)
213
		}
214
		defer os.Remove(f.Name())
215
	}
216
217
	res, err := lang.RunFile(f)
218
	os.Stdout.Write(res)
219
	if err != nil {
220
		os.Exit(1)
221
	}
222
}
223
224
func parseCommand() (string, []string) {
225
	if len(os.Args) == 1 {
226
		return "server", []string{}
227
	} else {
228
		return os.Args[1], os.Args[2:]
229
	}
230
}
231
232
var language = flag.String("l", "", "The language to use for code passed via stdin.")
233
234
func main() {
235
	cmd, args := parseCommand()
236
	flag.CommandLine.Parse(args)
237
238
	switch cmd {
239
	case "server":
240
		runServer()
241
	case "run":
242
		runOnce(flag.Args())
243
	default:
244
		fmt.Println("Error: Unknown command:", cmd)
245
		os.Exit(1)
246
	}
247
}
248
160 249
const homePageTemplateStr = `
161 250
<!doctype html>
162 251
<html>