package cmd import ( "net/http" "orus.io/orus-io/go-orusapi" ) //nolint:lll type ServeCmd[E any] struct { Server *orusapi.Server AutoMigrate bool `long:"auto-migrate" ini-name:"auto-migrate" description:"Automaticaly migrate the database if necessary" env:"AUTOMIGRATE"` program *Program[E] } type serveAPI struct { name string handler http.Handler } func (api *serveAPI) Name() string { return api.name } func (api *serveAPI) Handler() http.Handler { return api.handler } func (api *serveAPI) PreServerShutdown() { } func (api *serveAPI) ServerShutdown() { } func (cmd *ServeCmd[E]) Execute([]string) error { if err := cmd.program.EnsureDB(cmd.AutoMigrate); err != nil { return err } defer cmd.program.CloseDB() handler := cmd.program.setupHandler(cmd.program) for i := len(cmd.program.middlewares) - 1; i >= 0; i-- { m := cmd.program.middlewares[i] h, err := m.Middleware(handler) if err != nil { return err } handler = h } cmd.Server.SetLog(cmd.program.Logger) cmd.Server.Environment = cmd.program.InfoOptions.Environment cmd.Server.SetAPI(&serveAPI{ name: cmd.program.Parser.Name, handler: handler, }) defer func() { if err := cmd.Server.Shutdown(); err != nil { cmd.program.Logger.Err(err).Msg("error shutting down the server") } }() if err := cmd.Server.Serve(); err != nil { return err } return nil } func SetupServeCmd[E any](program *Program[E]) *ServeCmd[E] { cmd := ServeCmd[E]{ program: program, Server: orusapi.NewServer(nil), } serve, err := program.Parser.AddCommand("serve", "Serves the API", "", &cmd) if err != nil { program.Logger.Fatal().Msg(err.Error()) } serve.EnvNamespace = "SERVE" return &cmd }