fj/internal/config/config.go
2025-12-08 09:49:07 +01:00

110 lines
1.9 KiB
Go

package config
import (
"fmt"
"os"
"path/filepath"
"github.com/spf13/viper"
"gopkg.in/yaml.v3"
)
type Config struct {
Hosts map[string]HostConfig `yaml:"hosts"`
}
type HostConfig struct {
Hostname string `yaml:"hostname"`
Token string `yaml:"token"`
User string `yaml:"user,omitempty"`
GitProtocol string `yaml:"git_protocol,omitempty"`
}
func GetConfigDir() (string, error) {
home, err := os.UserHomeDir()
if err != nil {
return "", err
}
return filepath.Join(home, ".config", "fgj"), nil
}
func GetConfigPath() (string, error) {
dir, err := GetConfigDir()
if err != nil {
return "", err
}
return filepath.Join(dir, "config.yaml"), nil
}
func Load() (*Config, error) {
path, err := GetConfigPath()
if err != nil {
return nil, err
}
data, err := os.ReadFile(path)
if err != nil {
if os.IsNotExist(err) {
return &Config{Hosts: make(map[string]HostConfig)}, nil
}
return nil, err
}
var cfg Config
if err := yaml.Unmarshal(data, &cfg); err != nil {
return nil, err
}
if cfg.Hosts == nil {
cfg.Hosts = make(map[string]HostConfig)
}
return &cfg, nil
}
func (c *Config) Save() error {
path, err := GetConfigPath()
if err != nil {
return err
}
dir := filepath.Dir(path)
if err := os.MkdirAll(dir, 0755); err != nil {
return err
}
data, err := yaml.Marshal(c)
if err != nil {
return err
}
return os.WriteFile(path, data, 0600)
}
func (c *Config) GetHost(hostname string) (HostConfig, error) {
if hostname == "" {
hostname = viper.GetString("hostname")
}
if hostname == "" {
hostname = os.Getenv("FGJ_HOST")
}
if hostname == "" {
hostname = "codeberg.org"
}
host, ok := c.Hosts[hostname]
if !ok {
return HostConfig{}, fmt.Errorf("no configuration found for host %s", hostname)
}
return host, nil
}
func (c *Config) SetHost(hostname string, host HostConfig) {
if c.Hosts == nil {
c.Hosts = make(map[string]HostConfig)
}
c.Hosts[hostname] = host
}