Files
sanity/internal/config/config.go
todor ac836d0b67
All checks were successful
Build sanity / build (push) Successful in 11s
init
2026-05-31 18:00:20 +02:00

78 lines
1.7 KiB
Go

package config
import (
"fmt"
"os"
"time"
"gopkg.in/yaml.v3"
)
type Config struct {
ServerName string `yaml:"server_name"`
DiscordWebhookURL string `yaml:"discord_webhook_url"`
NotifyRoleID string `yaml:"notify_role_id"`
RequestTimeout time.Duration `yaml:"request_timeout"`
Backup Backup `yaml:"backup"`
}
type Backup struct {
Interval time.Duration `yaml:"interval"`
SourceFile string `yaml:"source_file"`
OutputDir string `yaml:"output_dir"`
FilePrefix string `yaml:"file_prefix"`
}
func Load(path string) (Config, error) {
data, err := os.ReadFile(path)
if err != nil {
return Config{}, err
}
var cfg Config
if err := yaml.Unmarshal(data, &cfg); err != nil {
return Config{}, err
}
applyDefaults(&cfg)
if err := cfg.Validate(); err != nil {
return Config{}, err
}
return cfg, nil
}
func applyDefaults(cfg *Config) {
if cfg.RequestTimeout == 0 {
cfg.RequestTimeout = 10 * time.Second
}
if cfg.Backup.Interval == 0 {
cfg.Backup.Interval = 24 * time.Hour
}
if cfg.Backup.FilePrefix == "" {
cfg.Backup.FilePrefix = "db"
}
}
func (cfg Config) Validate() error {
if cfg.ServerName == "" {
return fmt.Errorf("server_name is required")
}
if cfg.DiscordWebhookURL == "" {
return fmt.Errorf("discord_webhook_url is required")
}
if cfg.Backup.Interval <= 0 {
return fmt.Errorf("backup.interval must be > 0")
}
if cfg.Backup.SourceFile == "" {
return fmt.Errorf("backup.source_file is required")
}
if cfg.Backup.OutputDir == "" {
return fmt.Errorf("backup.output_dir is required")
}
if cfg.Backup.FilePrefix == "" {
return fmt.Errorf("backup.file_prefix is required")
}
return nil
}