package config import ( "os" "gopkg.in/yaml.v3" ) type Config struct { Game GameConfig `yaml:"game"` Colors ColorsConfig `yaml:"colors"` Telnet TelnetConfig `yaml:"telnet"` HTTP HTTPConfig `yaml:"http"` HTTPS HTTPSConfig `yaml:"https"` } type ColorsConfig map[string]string func DefaultColors() ColorsConfig { return ColorsConfig{ "room_name": "fg=cyan bold", "room_number": "dim", "room_desc": "fg=white", "direction": "fg=cyan", "exit_direction": "fg=cyan", "exit_name": "fg=green", "mob_name": "fg=bright_red", "friendly_npc": "fg=green", "hostile_npc": "fg=bright_red", "damage": "fg=red", "enemy_hp": "fg=red", "character_hp": "fg=green", "xp": "fg=yellow", "level_up": "fg=bright_yellow bold", "item": "fg=green", "player_name": "fg=bright_white", "death": "fg=red bold", "victory": "fg=green", "miss": "dim", "error": "fg=red", } } type GameConfig struct { TickLength int `yaml:"tick_length"` } type TelnetConfig struct { Enabled bool `yaml:"enabled"` Port int `yaml:"port"` } type HTTPConfig struct { Enabled bool `yaml:"enabled"` Port int `yaml:"port"` } type HTTPSConfig struct { Enabled bool `yaml:"enabled"` Port int `yaml:"port"` CertFile string `yaml:"cert_file"` KeyFile string `yaml:"key_file"` } func Default() *Config { return &Config{ Game: GameConfig{ TickLength: 600, }, Colors: DefaultColors(), Telnet: TelnetConfig{ Enabled: true, Port: 4000, }, HTTP: HTTPConfig{ Enabled: false, Port: 8080, }, HTTPS: HTTPSConfig{ Enabled: false, Port: 8443, }, } } func Load(path string) (*Config, error) { data, err := os.ReadFile(path) if err != nil { return nil, err } cfg := Default() if err := yaml.Unmarshal(data, cfg); err != nil { return nil, err } return cfg, nil } func SaveDefault(path string) error { cfg := Default() data, err := yaml.Marshal(cfg) if err != nil { return err } return os.WriteFile(path, data, 0644) }