package config import ( "fmt" "os" "time" "gopkg.in/yaml.v3" ) // Config holds all configuration for the application type Config struct { Server ServerConfig `yaml:"server"` Identity IdentityConfig `yaml:"identity"` Notification NotificationConfig `yaml:"notification"` Database DatabaseConfig `yaml:"database"` Rules RulesConfig `yaml:"rules"` } type ServerConfig struct { Port int `yaml:"port"` WebhookSecret string `yaml:"webhook_secret"` } type IdentityConfig struct { Provider string `yaml:"provider"` CacheTTL time.Duration `yaml:"cache_ttl"` Gitea GiteaConfig `yaml:"gitea"` } type GiteaConfig struct { URL string `yaml:"url"` Token string `yaml:"token"` } type NotificationConfig struct { Provider string `yaml:"provider"` Slack SlackConfig `yaml:"slack"` } type SlackConfig struct { BotToken string `yaml:"bot_token"` DefaultChannel string `yaml:"default_channel"` } type DatabaseConfig struct { Driver string `yaml:"driver"` DSN string `yaml:"dsn"` } type RulesConfig struct { PR PRRules `yaml:"pr"` Issue IssueRules `yaml:"issue"` Comment CommentRules `yaml:"comment"` } type PRRules struct { NotifyOwner bool `yaml:"notify_owner"` NotifyReviewers bool `yaml:"notify_reviewers"` NotifyAssignees bool `yaml:"notify_assignees"` } type IssueRules struct { NotifyAssignees bool `yaml:"notify_assignees"` } type CommentRules struct { NotifyMentioned bool `yaml:"notify_mentioned"` NotifyThreadOwner bool `yaml:"notify_thread_owner"` NotifyReviewers bool `yaml:"notify_reviewers"` } // Load reads configuration from a YAML file func Load(path string) (*Config, error) { data, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("reading config file: %w", err) } // Expand environment variables data = []byte(os.ExpandEnv(string(data))) var cfg Config if err := yaml.Unmarshal(data, &cfg); err != nil { return nil, fmt.Errorf("parsing config file: %w", err) } // Set defaults if cfg.Server.Port == 0 { cfg.Server.Port = 8080 } if cfg.Identity.CacheTTL == 0 { cfg.Identity.CacheTTL = 24 * time.Hour } if cfg.Database.Driver == "" { cfg.Database.Driver = "sqlite" } return &cfg, nil }