package main import ( "flag" "log" "net/http" "os" "path/filepath" "strings" "git.max-richter.dev/max/marka/server/internal/adapters" "git.max-richter.dev/max/marka/server/internal/handler" ) type multi []string func (m *multi) String() string { return strings.Join(*m, ",") } func (m *multi) Set(v string) error { *m = append(*m, v) return nil } func main() { var roots multi flag.Var(&roots, "root", "repeatable; specify multiple -root flags") addr := flag.String("addr", ":8080", "listen address") playgroundRoot := flag.String("playground-root", "", "path to playground build directory") flag.Parse() if *playgroundRoot != "" { absPlaygroundRoot, err := filepath.Abs(*playgroundRoot) must(err) info, err := os.Stat(absPlaygroundRoot) must(err) if !info.IsDir() { log.Fatalf("playground-root %s is not a directory", *playgroundRoot) } log.Printf("serving playground from %s", absPlaygroundRoot) http.Handle("/_playground/", http.StripPrefix("/_playground/", http.FileServer(http.Dir(absPlaygroundRoot)))) } if len(roots) == 0 { log.Fatal("at least one -root flag must be specified") } absRoots := make([]string, len(roots)) for i, r := range roots { abs, err := filepath.Abs(r) must(err) info, err := os.Stat(abs) must(err) if !info.IsDir() { log.Fatalf("root %s is not a directory", r) } absRoots[i] = abs } fsAdapter, err := adapters.NewLocalFsAdapter(absRoots) must(err) http.Handle("/", handler.NewHandler(fsAdapter)) log.Printf("listening on %s, roots=%s", *addr, strings.Join(absRoots, ", ")) log.Fatal(http.ListenAndServe(*addr, nil)) } func must(err error) { if err != nil { log.Fatal(err) } }