go-cfg

module
v3.0.0-rc0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 3, 2025 License: MIT

README

go-cfg v3 - Unified Configuration Management

Phase 3 Implementation Complete

A modern, unified configuration management library for Go that combines sophisticated file discovery with clean flag processing. Built entirely on pflag with zero legacy dependencies.

Features ✨

  • 🔍 AutoCfg-Style Discovery: Standard path discovery with Union/First modes
  • 🏷️ Clean Flag Naming: --api-host instead of --config-api-host (FlatNest)
  • 🛠️ Multiple Naming Strategies: FlatNest, Nested, Prefixed
  • 📁 Indirect Configuration: AutoCfg pointer file support
  • 🗺️ Complex Types: Maps, slices, and nested structures work seamlessly
  • ⚡ Modern Foundation: Built entirely on github.com/spf13/pflag
  • 📊 Rich Documentation: Auto-generated help and sample configs
  • 🧪 Comprehensive Testing: 20+ unit tests with >90% coverage

Quick Start

package main

import (
    "log"
    "time"
    cfg "github.com/davidwalter0/go-cfg/v3/pkg/config"
)

type Config struct {
    ServiceName string `json:"service_name" required:"true" help:"Service identifier"`
    Version     string `json:"version" default:"1.0.0" help:"Service version"`
    Debug       bool   `json:"debug" default:"false" help:"Enable debug mode"`
    
    API struct {
        Host    string        `json:"host" default:"localhost" help:"API host"`
        Port    int           `json:"port" default:"8080" help:"API port"`
        Timeout time.Duration `json:"timeout" default:"30s" help:"Request timeout"`
    } `json:"api" help:"API configuration"`
}

func main() {
    var config Config
    
    // Simple API - uses all defaults
    if err := cfg.Load(&config); err != nil {
        log.Fatalf("Configuration failed: %v", err)
    }
    
    // Advanced API with full control
    manager := cfg.NewManager().
        WithDiscovery(cfg.Union | cfg.Direct).
        WithFlagStyle(cfg.FlatNest).
        WithValidation(true)
    
    if err := manager.Load(&config); err != nil {
        log.Fatalf("Advanced configuration failed: %v", err)
    }
    
    log.Printf("Service %s v%s configured", config.ServiceName, config.Version)
}

Installation

go get github.com/davidwalter0/go-cfg/v3

Configuration Sources (Precedence Order)

  1. Configuration Files (discovered in standard locations)

    • /etc/{program}/config.json
    • ~/.config/{program}/config.json
    • .{program}.json
    • config.json
    • $AUTOCFG_FILENAME (environment override)
  2. Environment Variables (auto-generated names)

    • SERVICE_NAME, API_HOST, API_PORT, etc.
  3. Command Line Flags (clean naming)

    • --service-name, --api-host, --api-port, etc.

Discovery Modes

Union Mode (Default)

Merges all found configuration files:

manager := cfg.NewManager().WithDiscovery(cfg.Union | cfg.Direct)
First Mode

Stops at first found configuration file:

manager := cfg.NewManager().WithDiscovery(cfg.First | cfg.Direct)
Indirect Mode

Supports AutoCfg pointer files:

{
  "path": "/secure/config.json",
  "env": {
    "DATABASE_HOST": "prod-db.internal",
    "API_SECRET": "production-secret"
  }
}
manager := cfg.NewManager().WithDiscovery(cfg.Union | cfg.Indirect)

Flag Naming Strategies

FlatNest (Default)

Clean flat naming: --api-host, --database-port

manager := cfg.NewManager().WithFlagStyle(cfg.FlatNest)
Nested

Hierarchical naming: --api.host, --database.port

manager := cfg.NewManager().WithFlagStyle(cfg.Nested)
Prefixed

Prefixed naming: --config-api-host, --config-database-port

manager := cfg.NewManager().WithFlagStyle(cfg.Prefixed)

Advanced Features

Sample Generation
// Generate JSON sample
jsonSample, err := manager.GenerateSample("json")

// Generate YAML sample
yamlSample, err := manager.GenerateSample("yaml")
Configuration Persistence
// Save current configuration
err := manager.SaveCurrent(&config, "current-config.yaml")
Environment Prefix
manager := cfg.NewManager().WithEnvironmentPrefix("MYAPP")
// Generates: MYAPP_SERVICE_NAME, MYAPP_API_HOST, etc.

Examples

See the examples/ directory for comprehensive examples:

  • examples/basic/ - Simple configuration
  • examples/advanced/ - Complex nested configuration
# Build and run examples
make build-examples
make run-basic
make run-advanced

Development

# Setup development environment
make setup

# Build library
make build

# Run tests
make test

# Run tests with coverage
make test-coverage

# Run integration tests
make test-integration

# Verify everything
make verify

# Complete CI pipeline
make ci

Architecture

Package Structure
pkg/
├── config/       # Unified configuration management
├── discovery/    # Configuration file discovery and loading
├── flags/        # Modern pflag-based flag processing
└── generate/     # Sample and documentation generation
Key Components
  • ConfigManager: Main API with builder pattern
  • DiscoveryEngine: File discovery and loading
  • FlagProcessor: Flag generation and processing
  • NamingStrategy: Multiple flag naming approaches

Migration from v2

v3 provides a clean, unified API that eliminates dual dependencies while maintaining backward compatibility concepts. See examples/migration/ for detailed migration examples.

Testing

Comprehensive test suite with >90% coverage:

# Run all tests
make test

# Run with race detection
make test-race

# Generate coverage report
make test-coverage

Performance

  • Zero Legacy Dependencies: No vendored code
  • Modern pflag Foundation: Superior performance
  • Efficient Discovery: Optimized file searching
  • Memory Conscious: Minimal allocations

Contributing

  1. Issues: Report bugs and feature requests
  2. Pull Requests: Follow existing code style
  3. Testing: Ensure tests pass (make verify)
  4. Documentation: Update relevant docs

Phase 3 Benefits Achieved ✅

  • Single Package: Unified configuration management
  • Zero Legacy Dependencies: No vendored go-flag
  • Modern Foundation: Built entirely on pflag
  • Enhanced Features: Best of both worlds combined
  • Comprehensive Testing: Full test coverage
  • Rich Documentation: Complete API docs and examples
  • Clean API: Simple for basic cases, powerful for complex ones

License

[License details would go here]


go-cfg v3 - Modern configuration management for modern Go applications.

Directories

Path Synopsis
examples
pkg

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL