package config import ( "encoding/json" "os" "path/filepath" "runtime" "strings" ) const appName = "luxtools-client" // Config stores client configuration loaded from disk. type Config struct { PathMap map[string]string `json:"path_map"` } // ConfigPath returns the full path to the config.json file. func ConfigPath() (string, error) { dir, err := configDir() if err != nil { return "", err } return filepath.Join(dir, "config.json"), nil } func configDir() (string, error) { if dir, err := os.UserConfigDir(); err == nil && strings.TrimSpace(dir) != "" { return filepath.Join(dir, appName), nil } home, err := os.UserHomeDir() if err != nil { return "", err } switch runtime.GOOS { case "windows": if v := strings.TrimSpace(os.Getenv("APPDATA")); v != "" { return filepath.Join(v, appName), nil } return filepath.Join(home, "AppData", "Roaming", appName), nil case "darwin": return filepath.Join(home, "Library", "Application Support", appName), nil default: return filepath.Join(home, ".config", appName), nil } } // Load reads the config from disk. If the file does not exist, it returns an empty config. func Load(path string) (Config, error) { cfg := Config{PathMap: map[string]string{}} b, err := os.ReadFile(path) if err != nil { if os.IsNotExist(err) { return cfg, nil } return cfg, err } if len(b) == 0 { return cfg, nil } if err := json.Unmarshal(b, &cfg); err != nil { return cfg, err } if cfg.PathMap == nil { cfg.PathMap = map[string]string{} } return cfg, nil } // Save writes the config to disk. func Save(path string, cfg Config) error { if cfg.PathMap == nil { cfg.PathMap = map[string]string{} } if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { return err } b, err := json.MarshalIndent(cfg, "", " ") if err != nil { return err } return os.WriteFile(path, b, 0o644) }