package main import ( "github.com/joho/godotenv" "log" "os" "reflect" ) type config struct { DbPath string `env:"DB_PATH"` AdminUsername string `env:"ADMIN_USERNAME" required:"true"` AdminPassword string `env:"ADMIN_PASSWORD" required:"true"` Host string `env:"HOST"` Port string `env:"PORT"` WebhookDomain string `env:"WEBHOOK_DOMAIN" required:"true"` RepoURL string `env:"REPO_URL"` DemoBotURL string `env:"DEMO_BOT_URL"` PrivacyURL string `env:"PRIVACY_URL"` TermsURL string `env:"TERMS_URL"` } func getConfig() config { err := godotenv.Load() if err != nil { log.Println("Couldn't load from dotenv:", err.Error()) } conf := config{ DbPath: "db.sqlite", Host: "0.0.0.0", Port: "8080", RepoURL: "https://git.massivebox.net/massivebox/deletedbot", DemoBotURL: "https://t.me/DeletedBotDemoBot", PrivacyURL: "privacy", TermsURL: "terms", } v := reflect.ValueOf(&conf).Elem() t := v.Type() for i := 0; i < v.NumField(); i++ { field := v.Field(i) fieldType := t.Field(i) envTag := fieldType.Tag.Get("env") requiredTag := fieldType.Tag.Get("required") if envTag != "" { envValue := os.Getenv(envTag) if envValue != "" { field.SetString(envValue) } } if requiredTag == "true" && field.String() == "" { log.Panicf("Required environment variable %s is not set", envTag) } } return conf }