core/cmd/twhelp/app.go

78 lines
1.7 KiB
Go

package main
import (
"fmt"
"log/slog"
"slices"
"github.com/urfave/cli/v2"
"go.uber.org/automaxprocs/maxprocs"
)
type appMode string
const (
appModeProduction appMode = "production"
appModeDevelopment appMode = "development"
)
func (m appMode) String() string {
return string(m)
}
var (
appFlagMode = &cli.GenericFlag{
Name: "mode",
Value: &EnumValue{
Enum: []string{appModeDevelopment.String(), appModeProduction.String()},
Default: appModeDevelopment.String(),
},
Usage: fmt.Sprintf("%s or %s", appModeProduction, appModeDevelopment),
EnvVars: []string{"APP_MODE"},
}
appFlagAutoMaxProcs = &cli.BoolFlag{
Name: "autoMaxProcs",
Usage: "whether to set GOMAXPROCS automatically to match Linux container CPU quota" +
" (https://github.com/uber-go/automaxprocs)",
Value: false,
EnvVars: []string{"AUTO_MAX_PROCS"},
}
appFlags = []cli.Flag{
appFlagMode,
appFlagAutoMaxProcs,
}
)
type appWrapper struct {
*cli.App
logger *slog.Logger
}
func newApp(name, version string) *appWrapper {
app := &appWrapper{App: cli.NewApp(), logger: slog.Default()}
app.Name = name
app.HelpName = name
app.Version = version
app.Commands = []*cli.Command{cmdDB, cmdJob, cmdConsumer, cmdServe}
app.DefaultCommand = cmdServe.Name
app.Flags = slices.Concat(appFlags, logFlags)
app.Before = app.handleBefore
return app
}
func (a *appWrapper) handleBefore(c *cli.Context) error {
a.logger = newLoggerFromFlags(c)
c.Context = loggerToCtx(c.Context, a.logger)
if c.Bool(appFlagAutoMaxProcs.Name) {
_, _ = maxprocs.Set(maxprocs.Logger(func(s string, v ...any) {
a.logger.Info(fmt.Sprintf(s, v...))
}))
}
a.logger.Debug("executing command", slog.Any("args", c.Args().Slice()))
return nil
}