Newer
Older
package cmd
import (
"net/http"
"orus.io/orus-io/go-orusapi"
)
type ServeCmd[E any] struct {
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
}