package config import ( "errors" "os" "strconv" ) // Config содержит все настройки приложения type Config struct { Server ServerConfig `yaml:"server"` Paths PathsConfig `yaml:"paths"` Git GitConfig `yaml:"git"` } // ServerConfig содержит настройки HTTP сервера type ServerConfig struct { Port string `yaml:"port"` Timeout int `yaml:"timeout"` // в секундах } // PathsConfig содержит пути к директориям type PathsConfig struct { Obsidian string `yaml:"obsidian"` Quartz string `yaml:"quartz"` Public string `yaml:"public"` } // GitConfig содержит настройки Git type GitConfig struct { Branch string `yaml:"branch"` Remote string `yaml:"remote"` } // Load загружает конфигурацию из переменных окружения func Load() *Config { config := &Config{ Server: ServerConfig{ Port: getEnv("PORT", "3000"), Timeout: getEnvAsInt("SERVER_TIMEOUT", 30), }, Paths: PathsConfig{ Obsidian: getEnv("OBSIDIAN_PATH", "/obsidian"), Quartz: getEnv("QUARTZ_PATH", "/quartz"), Public: getEnv("PUBLIC_PATH", "/public"), }, Git: GitConfig{ Branch: getEnv("GIT_BRANCH", "main"), Remote: getEnv("GIT_REMOTE", "origin"), }, } return config } // Validate проверяет корректность конфигурации func (c *Config) Validate() error { if c.Server.Port == "" { return errors.New("server port is required") } if c.Paths.Obsidian == "" { return errors.New("obsidian path is required") } if c.Paths.Quartz == "" { return errors.New("quartz path is required") } if c.Paths.Public == "" { return errors.New("public path is required") } if c.Git.Branch == "" { return errors.New("git branch is required") } if c.Git.Remote == "" { return errors.New("git remote is required") } return nil } // getEnv получает значение переменной окружения или возвращает значение по умолчанию func getEnv(key, defaultValue string) string { if value := os.Getenv(key); value != "" { return value } return defaultValue } // getEnvAsInt получает значение переменной окружения как int или возвращает значение по умолчанию func getEnvAsInt(key string, defaultValue int) int { if value := os.Getenv(key); value != "" { if intValue, err := strconv.Atoi(value); err == nil { return intValue } } return defaultValue }