owenrtc / internal/config/config.go

github - master - back to tree - upstream
// Package config stores owenrtc app state (servers, ssh creds). package config import ( "encoding/json" "fmt" "os" "path/filepath" ) // Server is a managed remote or local server. type Server struct { ID string `json:"id"` Name string `json:"name"` Host string `json:"host"` Port int `json:"port"` User string `json:"user"` Password string `json:"password,omitempty"` } // Config is the owenrtc app state, stored in ~/.owenrtc/config.json. type Config struct { Servers []Server `json:"servers"` } func path() (string, error) { home, err := os.UserHomeDir() if err != nil { return "", fmt.Errorf("home dir: %w", err) } return filepath.Join(home, ".owenrtc", "config.json"), nil } // Load reads the config from disk, returns empty config if missing. func Load() (*Config, error) { p, err := path() if err != nil { return nil, err } data, err := os.ReadFile(p) if os.IsNotExist(err) { return &Config{}, nil } if err != nil { return nil, fmt.Errorf("read config: %w", err) } var c Config if err := json.Unmarshal(data, &c); err != nil { return nil, fmt.Errorf("parse config: %w", err) } return &c, nil } // Save writes the config to disk. func Save(c *Config) error { p, err := path() if err != nil { return err } if err := os.MkdirAll(filepath.Dir(p), 0o755); err != nil { return fmt.Errorf("mkdir config: %w", err) } data, err := json.MarshalIndent(c, "", " ") if err != nil { return fmt.Errorf("marshal config: %w", err) } if err := os.WriteFile(p, data, 0o600); err != nil { return fmt.Errorf("write config: %w", err) } return nil }