package cmd import ( "net/http" "orus.io/orus-io/go-orusapi" ) type ServeCmd struct { Server *orusapi.Server program *Program } 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) Execute([]string) error { if err := cmd.program.EnsureDB(); err != nil { return err } defer cmd.program.CloseDB() handler := cmd.program.setupHandler(cmd.program) 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(program *Program) *ServeCmd { cmd := ServeCmd{ 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 }