package config import ( "fmt" "os" "gopkg.in/yaml.v3" ) type Config struct { Server ServerConfig `yaml:"server"` Database DatabaseConfig `yaml:"database"` Sessions SessionConfig `yaml:"sessions"` Instance InstanceConfig `yaml:"instance"` } type ServerConfig struct { Host string `yaml:"host"` Port int `yaml:"port"` } type DatabaseConfig struct { Path string `yaml:"path"` } type SessionConfig struct { Secret string `yaml:"secret"` Secure bool `yaml:"secure"` MaxAge int `yaml:"max_age"` Domain string `yaml:"domain"` CookieName string `yaml:"cookie_name"` } type InstanceConfig struct { PortRange PortRangeConfig `yaml:"port_range"` StartCommand string `yaml:"start_command"` StopCommand string `yaml:"stop_command"` URLTemplate string `yaml:"url_template"` PrivateEndpoints []string `yaml:"private_endpoints"` Timeout int `yaml:"timeout"` BaseDomain string `yaml:"base_domain"` } type PortRangeConfig struct { Start int `yaml:"start"` End int `yaml:"end"` } func Load(path string) (*Config, error) { data, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("reading config file: %w", err) } var cfg Config if err := yaml.Unmarshal(data, &cfg); err != nil { return nil, fmt.Errorf("parsing config: %w", err) } if cfg.Sessions.Secret == "" { return nil, fmt.Errorf("session secret must not be empty") } if cfg.Instance.StartCommand == "" { return nil, fmt.Errorf("instance start command must be configured") } return &cfg, nil }