package config import ( "fmt" "os" "gopkg.in/yaml.v3" ) type Config struct { Server ServerConfig `yaml:"server"` Database DatabaseConfig `yaml:"database"` } type ServerConfig struct { Port int `yaml:"port"` } type DatabaseConfig struct { Host string `yaml:"host"` Port int `yaml:"port"` User string `yaml:"user"` Password string `yaml:"password"` Name string `yaml:"name"` SSLMode string `yaml:"sslmode"` } func Load(path string) (*Config, error) { cfg := &Config{ Server: ServerConfig{ Port: 50051, }, Database: DatabaseConfig{ Host: "localhost", Port: 5432, SSLMode: "disable", }, } if path == "" { return cfg, nil } data, err := os.ReadFile(path) if err != nil { if os.IsNotExist(err) { return cfg, nil } return nil, fmt.Errorf("read config: %w", err) } if err := yaml.Unmarshal(data, cfg); err != nil { return nil, fmt.Errorf("parse config: %w", err) } return cfg, nil } func (d *DatabaseConfig) DSN() string { if d.Host == "" || d.User == "" || d.Name == "" { return "" } return fmt.Sprintf( "postgres://%s:%s@%s:%d/%s?sslmode=%s", d.User, d.Password, d.Host, d.Port, d.Name, d.SSLMode, ) }