69 lines
1.5 KiB
Go
69 lines
1.5 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
// Config holds process configuration loaded from environment variables.
|
|
type Config struct {
|
|
HTTPAddr string
|
|
ReadTimeout time.Duration
|
|
WriteTimeout time.Duration
|
|
ShutdownGrace time.Duration
|
|
DatabaseDSN string
|
|
MigrationsDir string
|
|
}
|
|
|
|
func Load() (Config, error) {
|
|
readTimeout, err := envDuration("READ_TIMEOUT", 10*time.Second)
|
|
if err != nil {
|
|
return Config{}, err
|
|
}
|
|
|
|
writeTimeout, err := envDuration("WRITE_TIMEOUT", 15*time.Second)
|
|
if err != nil {
|
|
return Config{}, err
|
|
}
|
|
|
|
shutdownGrace, err := envDuration("SHUTDOWN_GRACE", 10*time.Second)
|
|
if err != nil {
|
|
return Config{}, err
|
|
}
|
|
|
|
return Config{
|
|
HTTPAddr: envOrDefault("HTTP_ADDR", ":9999"),
|
|
ReadTimeout: readTimeout,
|
|
WriteTimeout: writeTimeout,
|
|
ShutdownGrace: shutdownGrace,
|
|
DatabaseDSN: os.Getenv("DATABASE_DSN"),
|
|
MigrationsDir: envOrDefault("MIGRATIONS_DIR", "migrations"),
|
|
}, nil
|
|
}
|
|
|
|
func envOrDefault(key, fallback string) string {
|
|
if value := os.Getenv(key); value != "" {
|
|
return value
|
|
}
|
|
return fallback
|
|
}
|
|
|
|
func envDuration(key string, fallback time.Duration) (time.Duration, error) {
|
|
value := os.Getenv(key)
|
|
if value == "" {
|
|
return fallback, nil
|
|
}
|
|
|
|
seconds, err := strconv.Atoi(value)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("%s must be an integer number of seconds: %w", key, err)
|
|
}
|
|
if seconds <= 0 {
|
|
return 0, fmt.Errorf("%s must be > 0", key)
|
|
}
|
|
|
|
return time.Duration(seconds) * time.Second, nil
|
|
}
|