package config import ( "log" "log/slog" "os" "strings" "github.com/joho/godotenv" ) // Config holds our application's configuration. type Config struct { TelegramBotAPIKey string DBPath string LogLevel slog.Level } // LoadEnv loads environment variables from a .env file (if available). func LoadEnv() { if err := godotenv.Load(); err != nil { log.Println("Warning: .env file not found. Using system environment variables.") } } // GetConfig loads and validates configuration from the environment. func GetConfig() Config { // Load .env file first. LoadEnv() // Create a config struct. cfg := Config{} // Telegram bot's API key must not be empty. telegramBotAPIKey := os.Getenv("TELEGRAM_BOT_API_KEY") if telegramBotAPIKey == "" { panic("TELEGRAM_BOT_API_KEY is required!") } cfg.TelegramBotAPIKey = telegramBotAPIKey // Read DATABASE_FILE and default to badger.db dbPath := os.Getenv("DATABASE_FILE") if dbPath == "" { dbPath = "badger.db" } cfg.DBPath = dbPath // Read LOG_LEVEL and default to info if not set logLevel := os.Getenv("LOG_LEVEL") if logLevel == "" { logLevel = "info" } switch strings.ToLower(logLevel) { case "debug": cfg.LogLevel = slog.LevelDebug case "info": cfg.LogLevel = slog.LevelInfo case "warn": cfg.LogLevel = slog.LevelWarn case "error": cfg.LogLevel = slog.LevelError default: panic("invalid log level! value must be in debug, info, warn, or error!") } return cfg }