package internal import ( "context" "log/slog" "os" "os/signal" "os/user" "github.com/alecthomas/kong" "code.icb4dc0.de/prskr/searcherside/core/ports" clih "code.icb4dc0.de/prskr/searcherside/handlers/cli" "code.icb4dc0.de/prskr/searcherside/infrastructure/config" "code.icb4dc0.de/prskr/searcherside/internal/cli" ) type App struct { Logging config.Logging `embed:"" prefix:"logging."` Serve clih.ServerHandler `cmd:"" name:"serve" help:"Start the server" aliases:"server"` Migrate clih.MigrateHandler `cmd:"" name:"migrate" help:"Apply database migrations"` User clih.UsersHandler `cmd:"" name:"user" help:"Manage users"` Token clih.TokenHandler `cmd:"" name:"token" help:"Generate a token"` } func (a *App) Execute() error { wd, err := os.Getwd() if err != nil { return err } yamlLoader := config.Yaml{KeyFormatter: config.KebabToPascalCase} user, err := user.Current() if err != nil { return err } ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill) cliCtx := kong.Parse( a, kong.Name("searcherside"), kong.Description("SearcherSide"), kong.NamedMapper("password", cli.PasswordMapper{}), kong.Bind(ports.CWD(wd)), kong.BindTo(os.Stdout, (*ports.STDOUT)(nil)), kong.BindTo(ctx, (*context.Context)(nil)), kong.Configuration(yamlLoader.Loader, "./config.yaml", "/etc/searcherside/config.yaml", "~/.searcherside.yaml"), kong.Vars{ "CWD": wd, "WHOAMI": user.Username, }, ) return cliCtx.Run() } func (a *App) AfterApply(kongCtx *kong.Context) error { defaultLogger := slog.New(slog.NewJSONHandler(os.Stderr, a.Logging.Options())) slog.SetDefault(defaultLogger) kongCtx.Bind(defaultLogger) return nil }