package config import ( "encoding/json" "errors" "os" "path/filepath" ) type Config struct { CheckAUR bool `json:"check_aur"` ReminderIntervalHours int `json:"reminder_interval_hours"` Terminal string `json:"terminal"` Language string `json:"language"` AutoRefreshMinutes int `json:"auto_refresh_minutes"` ShowIgnored bool `json:"show_ignored"` NotificationsEnabled bool `json:"notifications_enabled"` KeepTerminalOpen bool `json:"keep_terminal_open"` ConfirmSelectedInstalls bool `json:"confirm_selected_installs"` IgnoredPackages []string `json:"ignored_packages"` } func Default() Config { return Config{ CheckAUR: true, ReminderIntervalHours: 168, Terminal: "auto", Language: "de", AutoRefreshMinutes: 30, ShowIgnored: false, NotificationsEnabled: true, KeepTerminalOpen: true, ConfirmSelectedInstalls: true, IgnoredPackages: []string{}, } } func Load(path string) (Config, error) { cfg := Default() data, err := os.ReadFile(path) if errors.Is(err, os.ErrNotExist) { return cfg, nil } if err != nil { return cfg, err } var raw map[string]json.RawMessage if err := json.Unmarshal(data, &raw); err != nil { return cfg, err } if err := json.Unmarshal(data, &cfg); err != nil { return cfg, err } defaults := Default() if _, ok := raw["notifications_enabled"]; !ok { cfg.NotificationsEnabled = defaults.NotificationsEnabled } if _, ok := raw["keep_terminal_open"]; !ok { cfg.KeepTerminalOpen = defaults.KeepTerminalOpen } if _, ok := raw["confirm_selected_installs"]; !ok { cfg.ConfirmSelectedInstalls = defaults.ConfirmSelectedInstalls } cfg = normalize(cfg) return cfg, nil } func Save(path string, cfg Config) error { cfg = normalize(cfg) if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { return err } data, err := json.MarshalIndent(cfg, "", " ") if err != nil { return err } data = append(data, '\n') return os.WriteFile(path, data, 0o644) } func normalize(cfg Config) Config { if cfg.ReminderIntervalHours <= 0 { cfg.ReminderIntervalHours = Default().ReminderIntervalHours } if cfg.Terminal == "" { cfg.Terminal = Default().Terminal } if cfg.Language != "de" && cfg.Language != "en" { cfg.Language = Default().Language } if cfg.AutoRefreshMinutes < 0 { cfg.AutoRefreshMinutes = Default().AutoRefreshMinutes } if cfg.IgnoredPackages == nil { cfg.IgnoredPackages = []string{} } return cfg }