package types import ( "web-app-template/log" ) type Settings struct { Port string PrometheusEnabled 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 { var smtp *SmtpSettings if env("SMTP_ENABLED") == "true" { 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.Fatal("SMTP_HOST must be set") } if smtp.Port == "" { log.Fatal("SMTP_PORT must be set") } if smtp.User == "" { log.Fatal("SMTP_USER must be set") } if smtp.Pass == "" { log.Fatal("SMTP_PASS must be set") } if smtp.FromMail == "" { log.Fatal("SMTP_FROM_MAIL must be set") } if smtp.FromName == "" { log.Fatal("SMTP_FROM_NAME must be set") } } settings := &Settings{ Port: env("PORT"), PrometheusEnabled: env("PROMETHEUS_ENABLED") == "true", BaseUrl: env("BASE_URL"), Environment: env("ENVIRONMENT"), Smtp: smtp, } if settings.BaseUrl == "" { log.Fatal("BASE_URL must be set") } if settings.Port == "" { log.Fatal("PORT must be set") } if settings.Environment == "" { log.Fatal("ENVIRONMENT must be set") } if settings.Environment == "prod" && (settings.Smtp == nil || !settings.PrometheusEnabled) { log.Fatal("SMTP and Prometheus must be enabled in production") } log.Info("BASE_URL is %q", settings.BaseUrl) log.Info("ENVIRONMENT is %q", settings.Environment) return settings }