package main import ( "fmt" "log/slog" "github.com/urfave/cli/v2" ) const ( appModeProduction = "production" appModeDevelopment = "development" ) var ( appFlagMode = &cli.GenericFlag{ Name: "mode", Value: &EnumValue{ Enum: []string{appModeDevelopment, appModeProduction}, Default: appModeDevelopment, }, Usage: fmt.Sprintf("%s or %s", appModeProduction, appModeDevelopment), EnvVars: []string{"APP_MODE"}, } appFlags = []cli.Flag{ appFlagMode, } ) 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} app.Flags = appFlags app.Before = app.handleBefore return app } func (a *appWrapper) handleBefore(c *cli.Context) error { c.Context = loggerToCtx(c.Context, a.logger) a.logger.Debug("executing command", slog.Any("args", c.Args().Slice())) return nil }