this repo has no description
at main 94 lines 1.8 kB view raw
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}