// Command app is the Bounty Board main service. package main import ( "context" "fmt" "log/slog" "os" "os/signal" "syscall" "bountyboard/internal/config" httpx "bountyboard/internal/http" "bountyboard/internal/metrics" ) func main() { if err := run(); err != nil { fmt.Fprintln(os.Stderr, "fatal:", err) os.Exit(1) } } func run() error { if err := config.LoadDotEnv(".env"); err != nil { return fmt.Errorf("load .env: %w", err) } cfg, err := config.Load() if err != nil { return err } log := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo})) slog.SetDefault(log) reg := metrics.NewRegistry() srv := httpx.New(cfg, log, reg) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() return srv.Run(ctx) }