// Package config manages the application-level configuration file // (config.yml), distinct from per-profile server settings stored in // the database. package config import ( "os" "lmvpn/internal/paths" "gopkg.in/yaml.v3" ) // AppConfig holds application-wide settings. type AppConfig struct { AutoConnect bool `yaml:"auto_connect"` MinimizeToTray bool `yaml:"minimize_to_tray"` CloseToTray bool `yaml:"close_to_tray"` DefaultProfileID int64 `yaml:"default_profile_id"` LogLevel string `yaml:"log_level"` // debug, info, warn, error Language string `yaml:"language"` // "", "auto", "en", "zh-Hans" } // Default returns the default configuration. func Default() AppConfig { return AppConfig{ AutoConnect: false, MinimizeToTray: true, CloseToTray: true, DefaultProfileID: 0, LogLevel: "info", Language: "", // empty = auto-detect from OS } } // Load reads the config file, returning defaults if it does not exist. func Load() (AppConfig, error) { cfg := Default() data, err := os.ReadFile(paths.ConfigPath()) if err != nil { if os.IsNotExist(err) { return cfg, nil } return cfg, err } if err := yaml.Unmarshal(data, &cfg); err != nil { return Default(), err } return cfg, nil } // Save writes the config file with 0600 permissions. func Save(cfg AppConfig) error { data, err := yaml.Marshal(cfg) if err != nil { return err } return os.WriteFile(paths.ConfigPath(), data, 0o600) }