package types import ( "log" "log/slog" ) type ServerSettings struct { BaseUrl string Environment string DbPath string Smtp *SmtpSettings } type SmtpSettings struct { Host string Port string User string Pass string FromMail string FromName string } func NewServerSettingsFromEnv(env func(string) string) *ServerSettings { dbPath := env("DB_PATH") if dbPath == "" { dbPath = "./data.db" } 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 := &ServerSettings{ BaseUrl: env("BASE_URL"), Environment: env("ENVIRONMENT"), Smtp: smtp, } if settings.BaseUrl == "" { log.Fatal("BASE_URL must be set") } if settings.Environment == "" { log.Fatal("ENVIRONMENT must be set") } if settings.Environment == "prod" && settings.Smtp == nil { log.Fatal("SMTP must be enabled in production") } slog.Info("BASE_URL is " + settings.BaseUrl) slog.Info("ENVIRONMENT is " + settings.Environment) return settings }