package types import ( "errors" "spend-sparrow/internal/log" ) var ( ErrMissingConfig = errors.New("missing config") ) type Settings struct { Port string OtelEnabled bool BaseUrl string Environment string Smtp *SmtpSettings } type SmtpSettings struct { Host string Port string User string Pass string FromMail string FromName string } func NewSettingsFromEnv(env func(string) string) (*Settings, error) { var ( smtp *SmtpSettings err error ) if env("SMTP_ENABLED") == "true" { smtp, err = getSmtpSettings(env) if err != nil { return nil, err } } settings := &Settings{ Port: env("PORT"), OtelEnabled: env("OTEL_ENABLED") == "true", BaseUrl: env("BASE_URL"), Environment: env("ENVIRONMENT"), Smtp: smtp, } if settings.BaseUrl == "" { log.L.Error("BASE_URL must be set") return nil, ErrMissingConfig } if settings.Port == "" { log.L.Error("PORT must be set") return nil, ErrMissingConfig } if settings.Environment == "" { log.L.Error("ENVIRONMENT must be set") return nil, ErrMissingConfig } log.L.Info("settings read", "BASE_URL", settings.BaseUrl) log.L.Info("settings read", "ENVIRONMENT", settings.Environment) return settings, nil } func getSmtpSettings(env func(string) string) (*SmtpSettings, error) { smtp := SmtpSettings{ Host: env("SMTP_HOST"), Port: env("SMTP_PORT"), User: env("SMTP_USER"), Pass: env("SMTP_PASS"), FromMail: env("SMTP_FROM_MAIL"), FromName: env("SMTP_FROM_NAME"), } if smtp.Host == "" { log.L.Error("SMTP_HOST must be set") return nil, ErrMissingConfig } if smtp.Port == "" { log.L.Error("SMTP_PORT must be set") return nil, ErrMissingConfig } if smtp.User == "" { log.L.Error("SMTP_USER must be set") return nil, ErrMissingConfig } if smtp.Pass == "" { log.L.Error("SMTP_PASS must be set") return nil, ErrMissingConfig } if smtp.FromMail == "" { log.L.Error("SMTP_FROM_MAIL must be set") return nil, ErrMissingConfig } if smtp.FromName == "" { log.L.Error("SMTP_FROM_NAME must be set") return nil, ErrMissingConfig } return &smtp, nil }