package cmd import ( "flag" "net/http" "os" "os/signal" "syscall" "github.com/julienschmidt/httprouter" "git.espin.casa/albert/logger" "git.espin.casa/albert/mercadona/internal/client" "git.espin.casa/albert/mercadona/internal/routes" ) func Run() error { // setup flags apiAddr := flag.String("api-addr", "localhost:3000", "REST API server address") logLevel := flag.String("level", "debug", "Log level") flag.Parse() // logfields logFields := logger.LogFields{} // setup logger log := logger.New(os.Stdout, *logLevel) // create router router := httprouter.New() client := client.NewClient() routes.CreateRoutes(router, client) // start http server go func() { http.ListenAndServe(*apiAddr, router) }() // info banner log.Info("started Mercadona api service", logFields) // wait signal to finish signal := WaitSignal() log.Info("signal received", logFields.Add(logger.LogFields{ "signal": signal, })) return nil } // WaitSignal catching exit signal func WaitSignal() os.Signal { ch := make(chan os.Signal, 2) signal.Notify( ch, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM, ) for { sig := <-ch switch sig { case syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM: return sig } } }