____ _ _______ __
/ __ \ | /| / / __/ |/ /
/ /_/ / |/ |/ / _// /
\____/|__/|__/___/_||_/
owenrtc / internal/config/config.go
// 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
}