package types import ( "errors" "log/slog" ) var ( ErrMissingConfig = errors.New("missing config") ) type Settings struct { Port string 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"), BaseUrl: env("BASE_URL"), Environment: env("ENVIRONMENT"), Smtp: smtp, } if settings.BaseUrl == "" { slog.Error("BASE_URL must be set") return nil, ErrMissingConfig } if settings.Port == "" { slog.Error("PORT must be set") return nil, ErrMissingConfig } if settings.Environment == "" { slog.Error("ENVIRONMENT must be set") return nil, ErrMissingConfig } slog.Info("settings read", "BASE_URL", settings.BaseUrl) slog.Info("settings read", "ENVIRONMENT", settings.Environment) slog.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 == "" { slog.Error("SMTP_HOST must be set") return nil, ErrMissingConfig } if smtp.Port == "" { slog.Error("SMTP_PORT must be set") return nil, ErrMissingConfig } if smtp.User == "" { slog.Error("SMTP_USER must be set") return nil, ErrMissingConfig } if smtp.Pass == "" { slog.Error("SMTP_PASS must be set") return nil, ErrMissingConfig } if smtp.FromMail == "" { slog.Error("SMTP_FROM_MAIL must be set") return nil, ErrMissingConfig } if smtp.FromName == "" { slog.Error("SMTP_FROM_NAME must be set") return nil, ErrMissingConfig } return &smtp, nil } func IsOtelEnabled(env func(string) string) bool { return env("OTEL_ENABLED") == "true" }