]> git.r.bdr.sh - rbdr/mobius/blobdiff - cmd/mobius-hotline-client/main.go
Refactor client to use slog and pass context (#107)
[rbdr/mobius] / cmd / mobius-hotline-client / main.go
index 6bc2d58bce15bd25d9b3c9a43b96aa8def666def..20bd7f22eb479ab9b232d664700cc68974ba1835 100644 (file)
@@ -6,15 +6,20 @@ import (
        "fmt"
        "github.com/jhalter/mobius/hotline"
        "github.com/rivo/tview"
-       "go.uber.org/zap"
-       "go.uber.org/zap/zapcore"
-       "log"
+       "log/slog"
        "os"
        "os/signal"
        "runtime"
        "syscall"
 )
 
+var logLevels = map[string]slog.Level{
+       "debug": slog.LevelDebug,
+       "info":  slog.LevelInfo,
+       "warn":  slog.LevelWarn,
+       "error": slog.LevelError,
+}
+
 func main() {
        _, cancelRoot := context.WithCancel(context.Background())
 
@@ -33,76 +38,45 @@ func main() {
                os.Exit(0)
        }
 
-       zapLvl, ok := zapLogLevel[*logLevel]
-       if !ok {
-               fmt.Printf("Invalid log level %s.  Must be debug, info, warn, or error.\n", *logLevel)
-               os.Exit(0)
-       }
-
        // init DebugBuffer
        db := &hotline.DebugBuffer{
                TextView: tview.NewTextView(),
        }
 
-       cores := []zapcore.Core{newZapCore(zapLvl, db)}
-
        // Add file logger if optional log-file flag was passed
        if *logFile != "" {
                f, err := os.OpenFile(*logFile,
                        os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
-               if err != nil {
-                       log.Println(err)
-               }
-               defer f.Close()
+               defer func() { _ = f.Close() }()
                if err != nil {
                        panic(err)
                }
-               cores = append(cores, newZapCore(zapLvl, f))
        }
 
-       l := zap.New(zapcore.NewTee(cores...))
-       defer func() { _ = l.Sync() }()
-       logger := l.Sugar()
-       logger.Infow("Started Mobius client", "Version", hotline.VERSION)
+       logger := slog.New(slog.NewTextHandler(db, &slog.HandlerOptions{Level: logLevels[*logLevel]}))
+       logger.Info("Started Mobius client", "Version", hotline.VERSION)
 
        go func() {
                sig := <-sigChan
-               logger.Infow("Stopping client", "signal", sig.String())
+               logger.Info("Stopping client", "signal", sig.String())
                cancelRoot()
        }()
 
-       client := hotline.NewClient(*configDir, logger)
+       client := hotline.NewUIClient(*configDir, logger)
        client.DebugBuf = db
        client.UI.Start()
-
-}
-
-func newZapCore(level zapcore.Level, syncer zapcore.WriteSyncer) zapcore.Core {
-       encoderCfg := zap.NewProductionEncoderConfig()
-       encoderCfg.TimeKey = "timestamp"
-       encoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder
-
-       return zapcore.NewCore(
-               zapcore.NewConsoleEncoder(encoderCfg),
-               zapcore.Lock(syncer),
-               level,
-       )
-}
-
-var zapLogLevel = map[string]zapcore.Level{
-       "debug": zap.DebugLevel,
-       "info":  zap.InfoLevel,
-       "warn":  zap.WarnLevel,
-       "error": zap.ErrorLevel,
 }
 
 func defaultConfigPath() (cfgPath string) {
-       os := runtime.GOOS
-       switch os {
+       switch runtime.GOOS {
        case "windows":
                cfgPath = "mobius-client-config.yaml"
        case "darwin":
-               cfgPath = "/usr/local/etc/mobius-client-config.yaml"
+               if _, err := os.Stat("/usr/local/etc/mobius-client-config.yaml"); err == nil {
+                       cfgPath = "/usr/local/etc/mobius-client-config.yaml"
+               } else if _, err := os.Stat("/opt/homebrew/etc/mobius-client-config.yaml"); err == nil {
+                       cfgPath = "/opt/homebrew/etc/mobius-client-config.yaml"
+               }
        case "linux":
                cfgPath = "/usr/local/etc/mobius-client-config.yaml"
        default: