1 package main // import "vimagination.zapto.org/justification" 2 3 import ( 4 "context" 5 "flag" 6 "fmt" 7 "log" 8 "net" 9 "net/http" 10 "os" 11 "os/signal" 12 "path/filepath" 13 ) 14 15 func main() { 16 if err := run(); err != nil { 17 log.Println(err) 18 } 19 } 20 21 func run() error { 22 defaultDir, err := os.UserConfigDir() 23 if err != nil { 24 return fmt.Errorf("error getting user config dir: %w", err) 25 } 26 port := flag.Uint("p", 8080, "port for server to listen on") 27 dir := flag.String("d", filepath.Join(defaultDir, "justification"), "directory to store uploaded JSON schemas") 28 flag.Parse() 29 30 schema, err := NewSchema(*dir) 31 if err != nil { 32 return err 33 } 34 35 server := &http.Server{ 36 Handler: schema, 37 } 38 39 l, err := net.ListenTCP("tcp", &net.TCPAddr{Port: int(*port)}) 40 if err != nil { 41 return fmt.Errorf("error listening on port %d: %w", *port, err) 42 } 43 44 go server.Serve(l) 45 46 // wait for SIGINT 47 48 sc := make(chan os.Signal, 1) 49 signal.Notify(sc, os.Interrupt) 50 <-sc 51 signal.Stop(sc) 52 close(sc) 53 54 return server.Shutdown(context.Background()) 55 } 56