Files
luxtools-client/internal/config/config.go

88 lines
1.8 KiB
Go

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)
}