88 lines
1.8 KiB
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)
|
|
}
|