Skip to content
Snippets Groups Projects
serve.go 1.43 KiB
package cmd

import (
	"net/http"

	"orus.io/orus-io/go-orusapi"
)

type ServeCmd struct {
	Server *orusapi.Server

	AutoMigrate bool `long:"auto-migrate" description:"Automaticaly migrate the database if necessary" env:"AUTOMIGRATE"`

	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(cmd.AutoMigrate); 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),
	}