package main import ( _ "embed" "fmt" "io" "io/ioutil" "local/args" "log" "net/http" "text/template" ) //go:embed words.json var words string //go:embed index.html var index string func main() { as := args.NewArgSet() as.Append(args.INT, "p", "port to listen on", 8091) as.Append(args.BOOL, "debug", "debug mode", false) if err := as.Parse(); err != nil { panic(err) } log.Printf("args: %+v", as) if err := http.ListenAndServe(fmt.Sprintf(":%d", as.GetInt("p")), server{args: as}); err != nil { panic(err) } } type server struct { args *args.ArgSet } func (server server) ServeHTTP(w http.ResponseWriter, r *http.Request) { if err := server.writeIndex(w); err != nil { panic(err) } } func (server server) writeIndex(w io.Writer) error { if server.args.GetBool("debug") { return server.writeIndexFile(w) } return server.writeIndexEmbed(w) } func (server server) writeIndexEmbed(w io.Writer) error { t := template.New("index") t, err := t.Parse(index) if err != nil { return err } return t.Execute(w, struct{ Words string }{Words: words}) } func (server server) writeIndexFile(w io.Writer) error { b, err := ioutil.ReadFile("words.json") if err != nil { return err } t, err := template.ParseFiles("index.html") if err != nil { return err } return t.Execute(w, struct{ Words string }{Words: string(b)}) }