package types import ( "context" "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(ctx context.Context, env func(string) string) (*Settings, error) { var ( smtp *SmtpSettings err error ) if env("SMTP_ENABLED") == "true" { smtp, err = getSmtpSettings(ctx, 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.ErrorContext(ctx, "BASE_URL must be set") return nil, ErrMissingConfig } if settings.Port == "" { slog.ErrorContext(ctx, "PORT must be set") return nil, ErrMissingConfig } if settings.Environment == "" { slog.ErrorContext(ctx, "ENVIRONMENT must be set") return nil, ErrMissingConfig } slog.InfoContext(ctx, "settings read", "BASE_URL", settings.BaseUrl) slog.InfoContext(ctx, "settings read", "ENVIRONMENT", settings.Environment) slog.InfoContext(ctx, "settings read", "ENVIRONMENT", settings.Environment) return settings, nil } func getSmtpSettings(ctx context.Context, 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.ErrorContext(ctx, "SMTP_HOST must be set") return nil, ErrMissingConfig } if smtp.Port == "" { slog.ErrorContext(ctx, "SMTP_PORT must be set") return nil, ErrMissingConfig } if smtp.User == "" { slog.ErrorContext(ctx, "SMTP_USER must be set") return nil, ErrMissingConfig } if smtp.Pass == "" { slog.ErrorContext(ctx, "SMTP_PASS must be set") return nil, ErrMissingConfig } if smtp.FromMail == "" { slog.ErrorContext(ctx, "SMTP_FROM_MAIL must be set") return nil, ErrMissingConfig } if smtp.FromName == "" { slog.ErrorContext(ctx, "SMTP_FROM_NAME must be set") return nil, ErrMissingConfig } return &smtp, nil } func IsOtelEnabled(env func(string) string) bool { return env("OTEL_ENABLED") == "true" }