51 lines
1.7 KiB
Markdown
51 lines
1.7 KiB
Markdown
# ADR-0004: Configuration Management Library
|
|
|
|
## Status
|
|
Accepted
|
|
|
|
## Context
|
|
The platform needs a configuration system that:
|
|
- Supports hierarchical configuration (defaults → files → env → secrets)
|
|
- Handles multiple formats (YAML, JSON, env vars)
|
|
- Provides type-safe access to configuration values
|
|
- Supports environment-specific overrides
|
|
- Can integrate with secret managers (future)
|
|
|
|
Options considered:
|
|
1. **spf13/viper** - Comprehensive configuration management
|
|
2. **envconfig** - Environment variable only
|
|
3. **koanf** - Lightweight configuration library
|
|
4. **Standard library + manual parsing** - No external dependency
|
|
|
|
## Decision
|
|
Use **spf13/viper** (v1.18.0+) with **spf13/cobra** (v1.8.0+) for configuration management.
|
|
|
|
**Rationale:**
|
|
- Industry standard for Go configuration management
|
|
- Supports multiple sources (files, env vars, flags)
|
|
- Hierarchical configuration with precedence rules
|
|
- Easy integration with Cobra for CLI commands
|
|
- Well-documented and widely used
|
|
- Supports future secret manager integration
|
|
|
|
## Consequences
|
|
|
|
### Positive
|
|
- Flexible configuration loading from multiple sources
|
|
- Easy to add new configuration sources
|
|
- Type-safe access methods
|
|
- Environment variable support via automatic env binding
|
|
|
|
### Negative
|
|
- Additional dependency
|
|
- Viper can be verbose for simple use cases
|
|
- Some learning curve for advanced features
|
|
|
|
### Implementation Notes
|
|
- Install: `go get github.com/spf13/viper@v1.18.0` and `github.com/spf13/cobra@v1.8.0`
|
|
- Create `pkg/config/config.go` interface to abstract Viper
|
|
- Implement `internal/config/viper_config.go` as concrete implementation
|
|
- Load order: `default.yaml` → `development.yaml`/`production.yaml` → env vars → secrets (future)
|
|
- Use typed getters (GetString, GetInt, GetBool) for type safety
|
|
|