searcherside/internal/app.go
Peter Kurfer 9ea9a8f658
Some checks failed
Go build / build (push) Failing after 1m58s
feat: continue basic setup
- setup ent scheme
- add command to create users
- document API
- add helpers to create migrations
- add command to run migrations
- add basic compose file
2024-06-19 21:19:37 +02:00

66 lines
1.7 KiB
Go

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
}