From 151fe6eb1cec2bc2a8df8f4b841d5293d852f8ff Mon Sep 17 00:00:00 2001 From: Xevion Date: Sun, 22 Jun 2025 18:42:43 -0500 Subject: [PATCH] refactor: remove confusing double app.go internal files, move setup details to main.go --- cmd/main.go | 62 +++++++++++++++++++++++---- internal/app.go | 110 ------------------------------------------------ 2 files changed, 53 insertions(+), 119 deletions(-) delete mode 100644 internal/app.go diff --git a/cmd/main.go b/cmd/main.go index 2116255..58bee29 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -2,24 +2,68 @@ package main import ( "fmt" + "io" "log" + "log/slog" "os" + "path/filepath" - "ha-tray/internal" + "ha-tray/internal/app" + "ha-tray/internal/service" ) func main() { - // Create new application instance - app := internal.NewApp() - - // Setup the application (logging, panic handling, service initialization) - if err := app.Setup(); err != nil { - log.Fatalf("Failed to setup application: %v", err) + // Setup logging + logger, logFile, err := setupLogging() + if err != nil { + log.Fatalf("Failed to setup logging: %v", err) } + defer logFile.Close() - // Run the application - if err := app.Run(); err != nil { + // Setup panic recovery + defer func() { + if r := recover(); r != nil { + logger.Error("Panic recovered", "panic", r) + } + }() + + // Create app layer + appLayer := app.NewApp(logger) + + // Create and run service + svc := service.NewService(logger, appLayer) + + logger.Info("Starting HATray application") + + if err := svc.Run(); err != nil { fmt.Fprintf(os.Stderr, "Application error: %v\n", err) os.Exit(1) } } + +// setupLogging initializes structured logging +func setupLogging() (*slog.Logger, *os.File, error) { + // Get the directory where the executable is located + exePath, err := os.Executable() + if err != nil { + return nil, nil, fmt.Errorf("failed to get executable path: %v", err) + } + exeDir := filepath.Dir(exePath) + + // Open log file in the same directory as the executable + logFile, err := os.OpenFile(filepath.Join(exeDir, "current.log"), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + return nil, nil, fmt.Errorf("failed to open log file: %v", err) + } + + // Create multi-writer to log to both file and stdout + multiWriter := io.MultiWriter(logFile, os.Stdout) + + // Create JSON handler for structured logging + handler := slog.NewJSONHandler(multiWriter, &slog.HandlerOptions{ + Level: slog.LevelDebug, + }) + logger := slog.New(handler) + + return logger, logFile, nil +} diff --git a/internal/app.go b/internal/app.go deleted file mode 100644 index db314a5..0000000 --- a/internal/app.go +++ /dev/null @@ -1,110 +0,0 @@ -package internal - -import ( - "fmt" - "io" - "log/slog" - "os" - "path/filepath" - - "ha-tray/internal/app" - "ha-tray/internal/service" -) - -// App represents the main application -type App struct { - appLayer *app.App - service service.Service - logger *slog.Logger - logFile *os.File -} - -// NewApp creates a new application instance -func NewApp() *App { - return &App{} -} - -// Setup initializes the application with logging and panic handling -func (a *App) Setup() error { - // Setup panic recovery - defer a.recoverPanic() - - // Setup logging - if err := a.setupLogging(); err != nil { - return fmt.Errorf("failed to setup logging: %v", err) - } - - // Setup app layer - a.appLayer = app.NewApp(a.logger) - - // Setup service - if err := a.setupService(); err != nil { - return fmt.Errorf("failed to setup service: %v", err) - } - - return nil -} - -// Run starts the application -func (a *App) Run() error { - defer a.cleanup() - - a.logger.Info("Starting HATray application") - - // Run the service - return a.service.Run() -} - -// setupLogging initializes structured logging -func (a *App) setupLogging() error { - // Get the directory where the executable is located - exePath, err := os.Executable() - if err != nil { - return fmt.Errorf("failed to get executable path: %v", err) - } - exeDir := filepath.Dir(exePath) - - // Open log file in the same directory as the executable - logFile, err := os.OpenFile(filepath.Join(exeDir, "current.log"), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) - if err != nil { - return fmt.Errorf("failed to open log file: %v", err) - } - - a.logFile = logFile - - // Create multi-writer to log to both file and stdout - multiWriter := io.MultiWriter(logFile, os.Stdout) - - // Create JSON handler for structured logging - handler := slog.NewJSONHandler(multiWriter, &slog.HandlerOptions{ - Level: slog.LevelDebug, - }) - a.logger = slog.New(handler) - - return nil -} - -// setupService initializes the platform-specific service -func (a *App) setupService() error { - // Platform-specific service initialization using build flags - a.service = service.NewService(a.logger, a.appLayer) - return nil -} - -// recoverPanic handles panic recovery and logs the error -func (a *App) recoverPanic() { - if r := recover(); r != nil { - if a.logger != nil { - a.logger.Error("Panic recovered", "panic", r) - } else { - fmt.Printf("Panic recovered: %v\n", r) - } - } -} - -// cleanup performs cleanup operations -func (a *App) cleanup() { - if a.logFile != nil { - a.logFile.Close() - } -}