package main import ( "flag" "log" "net/http" "os" "forge.cadoles.com/wpetit/gengitkan/internal/config" "forge.cadoles.com/wpetit/gengitkan/internal/route" "github.com/go-chi/chi" "github.com/go-chi/chi/middleware" "github.com/pkg/errors" "gitlab.com/wpetit/goweb/middleware/container" ) //nolint: gochecknoglobals var ( configFile = "" workdir = "" dumpConfig = false ) //nolint: gochecknoinits func init() { flag.StringVar(&configFile, "config", configFile, "configuration file") flag.StringVar(&workdir, "workdir", workdir, "working directory") flag.BoolVar(&dumpConfig, "dump-config", dumpConfig, "dump configuration and exit") } func main() { flag.Parse() // Switch to new working directory if defined if workdir != "" { if err := os.Chdir(workdir); err != nil { panic(errors.Wrapf(err, "change working directory to '%s'", workdir)) } } // Load configuration file if defined, use default configuration otherwise var conf *config.Config var err error if configFile != "" { conf, err = config.NewFromFile(configFile) if err != nil { panic(errors.Wrapf(err, "load config file '%s'", configFile)) } } else { conf = config.NewDefault() } // Dump configuration if asked if dumpConfig { if err := config.Dump(conf, os.Stdout); err != nil { log.Fatalf("%+v", errors.Wrapf(err, "dump config")) } os.Exit(0) } r := chi.NewRouter() // Define base middlewares r.Use(middleware.Logger) r.Use(middleware.Recoverer) // Create service container ctn, err := getServiceContainer(conf) if err != nil { log.Fatalf("%+v", errors.Wrap(err, "create service container")) } // Expose service container on router r.Use(container.ServiceContainer(ctn)) // Define routes route.Mount(r, conf) log.Printf("listening on '%s'", conf.HTTP.Address) if err := http.ListenAndServe(conf.HTTP.Address, r); err != nil { log.Fatalf("%+v", errors.Wrapf(err, "listen '%s'", conf.HTTP.Address)) } }