Files
Gardomatic/cmd/cli/config.go
T
2026-09-14 19:58:31 +02:00

80 lines
1.9 KiB
Go

package main
import (
"fmt"
"os"
"strconv"
"strings"
"gardomatic.kleiax.de/internal/mailer"
)
type config struct {
dsn string
environment string
webBaseURL string
demoResetEnabled bool
json bool
yes bool
mail mailer.Config
}
func configFromEnvironment() (config, error) {
port, err := envInt("GARDOMATIC_SMTP_PORT", 25)
if err != nil {
return config{}, err
}
demoResetEnabled, err := envBool("GARDOMATIC_DEMO_RESET_ENABLED", false)
if err != nil {
return config{}, err
}
return config{
dsn: os.Getenv("GARDOMATIC_DB_DSN"),
environment: envString("GARDOMATIC_ENV", "development"),
webBaseURL: envString("GARDOMATIC_WEB_BASE_URL", "http://localhost:4040"),
demoResetEnabled: demoResetEnabled,
mail: mailer.Config{
Mode: mailer.Mode(envString("GARDOMATIC_SMTP_MODE", string(mailer.ModeFile))),
Host: os.Getenv("GARDOMATIC_SMTP_HOST"),
Port: port,
Username: os.Getenv("GARDOMATIC_SMTP_USERNAME"),
Password: os.Getenv("GARDOMATIC_SMTP_PASSWORD"),
Sender: envString("GARDOMATIC_SMTP_SENDER", "gardomatic@localhost"),
FilePath: envString("GARDOMATIC_SMTP_FILE_PATH", "/tmp/gardomatic-mails.log"),
},
}, nil
}
func envBool(name string, fallback bool) (bool, error) {
value := strings.TrimSpace(os.Getenv(name))
if value == "" {
return fallback, nil
}
b, err := strconv.ParseBool(value)
if err != nil {
return false, fmt.Errorf("%s must be a boolean: %w", name, err)
}
return b, nil
}
func envString(name, fallback string) string {
if value := strings.TrimSpace(os.Getenv(name)); value != "" {
return value
}
return fallback
}
func envInt(name string, fallback int) (int, error) {
value := strings.TrimSpace(os.Getenv(name))
if value == "" {
return fallback, nil
}
n, err := strconv.Atoi(value)
if err != nil {
return 0, fmt.Errorf("%s must be an integer: %w", name, err)
}
return n, nil
}