package main import ( "net/http" "forge.cadoles.com/wpetit/fake-smtp/internal/route" "github.com/go-chi/chi" "github.com/go-chi/chi/middleware" "gitlab.com/wpetit/goweb/middleware/container" "flag" "fmt" "log" "os" "forge.cadoles.com/wpetit/fake-smtp/internal/config" "github.com/pkg/errors" ) //nolint: gochecknoglobals var ( configFile = "" workdir = "" dumpConfig = false version = false ) // nolint: gochecknoglobals var ( GitRef = "unknown" ProjectVersion = "unknown" BuildDate = "unknown" ) //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") flag.BoolVar(&version, "version", version, "show version and exit") } func main() { flag.Parse() if version { fmt.Printf("%s (%s) - %s\n", ProjectVersion, GitRef, BuildDate) os.Exit(0) } // Switch to new working directory if defined if workdir != "" { if err := os.Chdir(workdir); err != nil { log.Fatalf("%+v", errors.Wrapf(err, "could not 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 { log.Fatalf("%+v", errors.Wrapf(err, "could not load config file '%s'", configFile)) } } else { if dumpConfig { conf = config.NewDumpDefault() } else { conf = config.NewDefault() } } // Dump configuration if asked if dumpConfig { if err := config.Dump(conf, os.Stdout); err != nil { log.Fatalf("%+v", errors.Wrap(err, "could not dump config")) } os.Exit(0) } if err := config.WithEnvironment(conf); err != nil { log.Fatalf("%+v", errors.Wrap(err, "could not override config with environment")) } // Create service container ctn, err := getServiceContainer(conf) if err != nil { log.Fatalf("%+v", errors.Wrap(err, "could not create service container")) } go startSMTPServer(conf, ctn) r := chi.NewRouter() // Define base middlewares r.Use(middleware.Logger) r.Use(middleware.Recoverer) // Expose service container on router r.Use(container.ServiceContainer(ctn)) // Define routes if err := route.Mount(r, conf); err != nil { log.Fatalf("%+v", errors.Wrap(err, "could not mount http routes")) } log.Printf("listening on '%s'", conf.HTTP.Address) if err := http.ListenAndServe(conf.HTTP.Address, r); err != nil { log.Fatalf("%+v", errors.Wrapf(err, "could not listen on '%s'", conf.HTTP.Address)) } }