69 lines
1.5 KiB
Go
69 lines
1.5 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"
|
||
|
)
|
||
|
|
||
|
type App struct {
|
||
|
Logging struct {
|
||
|
Level slog.Level `env:"LOG_LEVEL" help:"Log level" default:"warn"`
|
||
|
} `embed:"" prefix:"logging."`
|
||
|
|
||
|
Serve clih.ServerHandler `cmd:"" name:"serve" help:"Start the server" aliases:"server"`
|
||
|
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.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 {
|
||
|
loggingOpts := slog.HandlerOptions{
|
||
|
Level: a.Logging.Level,
|
||
|
}
|
||
|
|
||
|
defaultLogger := slog.New(slog.NewJSONHandler(os.Stderr, &loggingOpts))
|
||
|
|
||
|
slog.SetDefault(defaultLogger)
|
||
|
|
||
|
kongCtx.Bind(defaultLogger)
|
||
|
|
||
|
return nil
|
||
|
}
|