package config import ( "errors" "log/slog" "os" "strconv" customlogger "github.com/SamuelTariku/FortuneBet-Backend/internal/logger" "github.com/joho/godotenv" ) var ( ErrInvalidDbUrl = errors.New("db url is invalid") ErrInvalidPort = errors.New("port number is invalid") ErrRefreshExpiry = errors.New("refresh token expiry is invalid") ErrAccessExpiry = errors.New("access token expiry is invalid") ErrInvalidJwtKey = errors.New("jwt key is invalid") ErrLogLevel = errors.New("log level not set") ErrInvalidLevel = errors.New("invalid log level") ErrInvalidEnv = errors.New("env not set or invalid") ) type Config struct { Port int DbUrl string RefreshExpiry int AccessExpiry int JwtKey string LogLevel slog.Level Env string } func NewConfig() (*Config, error) { config := &Config{} if err := config.loadEnv(); err != nil { return nil, err } return config, nil } func (c *Config) loadEnv() error { err := godotenv.Load() if err != nil { return errors.New("failed to load env file") } // env env := os.Getenv("ENV") if env == "" { return ErrInvalidEnv } c.Env = env portStr := os.Getenv("PORT") port, err := strconv.Atoi(portStr) if err != nil { return ErrInvalidPort } c.Port = port dbUrl := os.Getenv("DB_URL") if dbUrl == "" { return ErrInvalidDbUrl } c.DbUrl = dbUrl refreshExpiryStr := os.Getenv("REFRESH_EXPIRY") refreshExpiry, err := strconv.Atoi(refreshExpiryStr) if err != nil { return ErrRefreshExpiry } c.RefreshExpiry = refreshExpiry jwtKey := os.Getenv("JWT_KEY") if jwtKey == "" { return ErrInvalidJwtKey } c.JwtKey = jwtKey accessExpiryStr := os.Getenv("ACCESS_EXPIRY") accessExpiry, err := strconv.Atoi(accessExpiryStr) if err != nil { return ErrAccessExpiry } c.AccessExpiry = accessExpiry // log level logLevel := os.Getenv("LOG_LEVEL") if logLevel == "" { return ErrLogLevel } lvl, ok := customlogger.LogLevels[logLevel] if !ok { return ErrInvalidLevel } c.LogLevel = lvl return nil }