this repo has no description
1package main
2
3import (
4 "context"
5 "fmt"
6 "io"
7 "log/slog"
8 "os"
9 "strings"
10
11 _ "github.com/joho/godotenv/autoload"
12
13 "github.com/earthboundkid/versioninfo/v2"
14 "github.com/urfave/cli/v3"
15)
16
17func main() {
18 if err := run(os.Args); err != nil {
19 slog.Error("exiting", "err", err)
20 os.Exit(-1)
21 }
22}
23
24func run(args []string) error {
25
26 app := cli.Command{
27 Name: "atbin",
28 Usage: "atbin server daemon",
29 Version: versioninfo.Short(),
30 Flags: []cli.Flag{
31 &cli.StringFlag{
32 Name: "log-level",
33 Usage: "log verbosity level (eg: warn, info, debug)",
34 Sources: cli.EnvVars("ATBIN_LOG_LEVEL", "GO_LOG_LEVEL", "LOG_LEVEL"),
35 },
36 },
37 Commands: []*cli.Command{
38 &cli.Command{
39 Name: "serve",
40 Usage: "run the atbin daemon",
41 Action: runServeCmd,
42 Flags: []cli.Flag{
43 &cli.StringFlag{
44 Name: "bind",
45 Usage: "specify the local IP/port to bind to",
46 Required: false,
47 Value: ":7700",
48
49 Sources: cli.EnvVars("ATBIN_BIND"),
50 },
51 },
52 },
53 },
54 }
55
56 return app.Run(context.Background(), args)
57}
58
59func configLogger(cmd *cli.Command, writer io.Writer) *slog.Logger {
60 var level slog.Level
61 switch strings.ToLower(cmd.String("log-level")) {
62 case "error":
63 level = slog.LevelError
64 case "warn":
65 level = slog.LevelWarn
66 case "info":
67 level = slog.LevelInfo
68 case "debug":
69 level = slog.LevelDebug
70 default:
71 level = slog.LevelInfo
72 }
73 logger := slog.New(slog.NewJSONHandler(writer, &slog.HandlerOptions{
74 Level: level,
75 }))
76 slog.SetDefault(logger)
77 return logger
78}
79
80func runServeCmd(ctx context.Context, cmd *cli.Command) error {
81 logger := configLogger(cmd, os.Stdout)
82
83 srv, err := NewServer(
84 Config{
85 Logger: logger,
86 Bind: cmd.String("bind"),
87 },
88 )
89 if err != nil {
90 return fmt.Errorf("failed to construct server: %v", err)
91 }
92
93 return srv.Run()
94}