diff --git a/server/cmd/main.go b/server/cmd/main.go index 26bbdba..c8d8a57 100644 --- a/server/cmd/main.go +++ b/server/cmd/main.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "io" + "net/http" "os" ) @@ -15,16 +16,26 @@ type iostreams struct { type Opts struct { ConfigPath string IO iostreams + Log func(string) + Logf func(string, ...interface{}) } func main() { var configFlag = flag.String("config", "config.yml", "A path to a config file.") flag.Parse() + io := iostreams{ + Err: os.Stderr, + Out: os.Stdout, + } opts := Opts{ ConfigPath: *configFlag, - IO: iostreams{ - Err: os.Stderr, - Out: os.Stdout, + IO: io, + // TODO use real logger + Log: func(s string) { + fmt.Fprintln(io.Out, s) + }, + Logf: func(s string, args ...interface{}) { + fmt.Fprintf(io.Out, s, args...) }, } @@ -41,7 +52,27 @@ func _main(opts Opts) error { os.Exit(1) } - fmt.Printf("DBG %#v\n", cfg.InstanceName) + setupAPI(opts, *cfg) + + // TODO TLS or SSL or something + opts.Logf("starting server at %s:%d\n", cfg.Host, cfg.Port) + if err := http.ListenAndServe(fmt.Sprintf("%s:%d", cfg.Host, cfg.Port), nil); err != nil { + return fmt.Errorf("http server exited with error: %w", err) + } return nil } + +func handler(opts Opts, cfg Config, f http.HandlerFunc) http.HandlerFunc { + // TODO make this more real + return func(w http.ResponseWriter, req *http.Request) { + opts.Log(req.URL.Path) + f(w, req) + } +} + +func setupAPI(opts Opts, cfg Config) { + http.HandleFunc("/instance", handler(opts, cfg, func(w http.ResponseWriter, req *http.Request) { + io.WriteString(w, cfg.InstanceName) + })) +}