202 lines
4.5 KiB
Markdown
202 lines
4.5 KiB
Markdown
# Environment Variables
|
|
|
|
The config package provides flexible environment variable support with automatic name transformation, custom mappings, and whitelist capabilities.
|
|
|
|
## Basic Usage
|
|
|
|
Environment variables are automatically mapped from configuration paths:
|
|
|
|
```go
|
|
cfg, _ := config.Quick(defaults, "MYAPP_", "config.toml")
|
|
|
|
// These environment variables are automatically loaded:
|
|
// MYAPP_SERVER_PORT → server.port
|
|
// MYAPP_DATABASE_URL → database.url
|
|
// MYAPP_LOG_LEVEL → log.level
|
|
// MYAPP_FEATURES_ENABLED → features.enabled
|
|
```
|
|
|
|
## Name Transformation
|
|
|
|
### Default Transformation
|
|
|
|
By default, paths are transformed as follows:
|
|
1. Dots (`.`) become underscores (`_`)
|
|
2. Converted to uppercase
|
|
3. Prefix is prepended
|
|
|
|
```go
|
|
// Path transformations:
|
|
// server.port → MYAPP_SERVER_PORT
|
|
// database.url → MYAPP_DATABASE_URL
|
|
// tls.cert.path → MYAPP_TLS_CERT_PATH
|
|
// maxRetries → MYAPP_MAXRETRIES
|
|
```
|
|
|
|
### Custom Transformation
|
|
|
|
Define custom environment variable mappings:
|
|
|
|
```go
|
|
cfg, _ := config.NewBuilder().
|
|
WithEnvTransform(func(path string) string {
|
|
switch path {
|
|
case "server.port":
|
|
return "PORT" // Use $PORT directly
|
|
case "database.url":
|
|
return "DATABASE_URL"
|
|
case "api.key":
|
|
return "API_KEY"
|
|
default:
|
|
// Fallback to default transformation
|
|
return "MYAPP_" + strings.ToUpper(
|
|
strings.ReplaceAll(path, ".", "_"),
|
|
)
|
|
}
|
|
}).
|
|
Build()
|
|
```
|
|
|
|
### No Transformation
|
|
|
|
Return empty string to skip environment lookup:
|
|
|
|
```go
|
|
cfg, _ := config.NewBuilder().
|
|
WithEnvTransform(func(path string) string {
|
|
// Only allow specific env vars
|
|
allowed := map[string]string{
|
|
"port": "PORT",
|
|
"database": "DATABASE_URL",
|
|
}
|
|
return allowed[path] // Empty string if not in map
|
|
}).
|
|
Build()
|
|
```
|
|
|
|
## Explicit Environment Variable Mapping
|
|
|
|
Use the `env` struct tag for explicit mappings:
|
|
|
|
```go
|
|
type Config struct {
|
|
Port int `toml:"port" env:"PORT"`
|
|
Database string `toml:"database" env:"DATABASE_URL"`
|
|
APIKey string `toml:"api_key" env:"API_KEY"`
|
|
}
|
|
|
|
// These use the explicit env tag names, ignoring prefix
|
|
cfg, _ := config.NewBuilder().
|
|
WithDefaults(&Config{}).
|
|
WithEnvPrefix("MYAPP_"). // Not used for tagged fields
|
|
Build()
|
|
```
|
|
|
|
Or register with explicit environment variable:
|
|
|
|
```go
|
|
cfg.RegisterWithEnv("server.port", 8080, "PORT")
|
|
cfg.RegisterWithEnv("database.url", "localhost", "DATABASE_URL")
|
|
```
|
|
|
|
## Using the `env` Tag
|
|
|
|
Structs can specify explicit environment variable names using the `env` tag:
|
|
|
|
```go
|
|
type Config struct {
|
|
Server struct {
|
|
Port int `toml:"port" env:"PORT"` // Uses $PORT
|
|
Host string `toml:"host" env:"SERVER_HOST"` // Uses $SERVER_HOST
|
|
} `toml:"server"`
|
|
}
|
|
```
|
|
|
|
## Environment Variable Whitelist
|
|
|
|
Limit which paths can be set via environment:
|
|
|
|
```go
|
|
cfg, _ := config.NewBuilder().
|
|
WithEnvWhitelist(
|
|
"server.port",
|
|
"database.url",
|
|
"api.key",
|
|
"log.level",
|
|
). // Only these paths read from environment
|
|
Build()
|
|
```
|
|
|
|
## Type Conversion
|
|
|
|
Environment variables (strings) are automatically converted to the registered type:
|
|
|
|
```bash
|
|
# Booleans
|
|
export MYAPP_DEBUG=true
|
|
export MYAPP_VERBOSE=false
|
|
|
|
# Numbers
|
|
export MYAPP_PORT=8080
|
|
export MYAPP_TIMEOUT=30
|
|
export MYAPP_RATIO=0.95
|
|
|
|
# Durations
|
|
export MYAPP_TIMEOUT=30s
|
|
export MYAPP_INTERVAL=5m
|
|
|
|
# Lists (comma-separated)
|
|
export MYAPP_TAGS=prod,stable,v2
|
|
```
|
|
|
|
## Manual Environment Loading
|
|
|
|
Load environment variables at any time:
|
|
|
|
```go
|
|
cfg := config.New()
|
|
cfg.RegisterStruct("", &Config{})
|
|
|
|
// Load with prefix
|
|
if err := cfg.LoadEnv("MYAPP_"); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
// Or use existing options
|
|
if err := cfg.LoadWithOptions("", nil, config.LoadOptions{
|
|
EnvPrefix: "MYAPP_",
|
|
Sources: []config.Source{config.SourceEnv},
|
|
}); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
```
|
|
|
|
## Discovering Environment Variables
|
|
|
|
Find which environment variables are set:
|
|
|
|
```go
|
|
// Discover all env vars matching registered paths
|
|
discovered := cfg.DiscoverEnv("MYAPP_")
|
|
|
|
for path, envVar := range discovered {
|
|
log.Printf("%s is set via %s", path, envVar)
|
|
}
|
|
```
|
|
|
|
## Precedence Examples
|
|
|
|
Default precedence: CLI > Env > File > Default
|
|
|
|
Custom precedence (Env > File > CLI > Default):
|
|
|
|
```go
|
|
cfg, _ := config.NewBuilder().
|
|
WithSources(
|
|
config.SourceEnv,
|
|
config.SourceFile,
|
|
config.SourceCLI,
|
|
config.SourceDefault,
|
|
).
|
|
Build()
|
|
``` |