searcherside/internal/app.go

67 lines
1.7 KiB
Go
Raw Normal View History

2024-06-06 20:08:51 +00:00
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"
2024-06-06 20:08:51 +00:00
)
type App struct {
Logging config.Logging `embed:"" prefix:"logging."`
2024-06-06 20:08:51 +00:00
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"`
2024-06-06 20:08:51 +00:00
}
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{}),
2024-06-06 20:08:51 +00:00
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()))
2024-06-06 20:08:51 +00:00
slog.SetDefault(defaultLogger)
kongCtx.Bind(defaultLogger)
return nil
}