Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,7 @@ coverage:
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out -o coverage.html
@echo "Coverage report generated: coverage.html"

# Generate example code
generate-example:
go generate ./example
24 changes: 21 additions & 3 deletions cfgx.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,12 @@ type GenerateOptions struct {
// MaxFileSize is the maximum size in bytes for files referenced with "file:" prefix.
// If zero, defaults to DefaultMaxFileSize (1 MB).
MaxFileSize int64

// Mode specifies the generation mode:
// "static" - values baked at build time (default)
// "getter" - generate getter methods with runtime env var overrides
// If empty, defaults to "static".
Mode string
}

// GenerateFromFile generates Go code from a TOML file and writes it to the output file.
Expand Down Expand Up @@ -131,8 +137,14 @@ func GenerateFromFile(opts *GenerateOptions) error {
maxFileSize = DefaultMaxFileSize
}

// Set default mode if not specified
mode := opts.Mode
if mode == "" {
mode = "static"
}

// Generate code
generated, err := GenerateWithOptions(data, packageName, opts.EnableEnv, inputDir, maxFileSize)
generated, err := GenerateWithOptions(data, packageName, opts.EnableEnv, inputDir, maxFileSize, mode)
if err != nil {
return fmt.Errorf("failed to generate code: %w", err)
}
Expand Down Expand Up @@ -166,7 +178,7 @@ func GenerateFromFile(opts *GenerateOptions) error {
// Note: This function does not support file: references since no input directory is provided.
// Use GenerateWithOptions for full file embedding support.
func Generate(tomlData []byte, packageName string, enableEnv bool) ([]byte, error) {
return GenerateWithOptions(tomlData, packageName, enableEnv, "", DefaultMaxFileSize)
return GenerateWithOptions(tomlData, packageName, enableEnv, "", DefaultMaxFileSize, "static")
}

// GenerateWithOptions generates Go code from TOML data with full options support.
Expand All @@ -179,9 +191,10 @@ func Generate(tomlData []byte, packageName string, enableEnv bool) ([]byte, erro
// - enableEnv: Whether to enable environment variable override markers in generated code
// - inputDir: Directory to resolve file: references from (empty string to disable)
// - maxFileSize: Maximum file size in bytes for file: references (0 for default 1MB)
// - mode: Generation mode ("static" or "getter")
//
// Returns the generated Go code as bytes, or an error if generation fails.
func GenerateWithOptions(tomlData []byte, packageName string, enableEnv bool, inputDir string, maxFileSize int64) ([]byte, error) {
func GenerateWithOptions(tomlData []byte, packageName string, enableEnv bool, inputDir string, maxFileSize int64, mode string) ([]byte, error) {
if packageName == "" {
packageName = "config"
}
Expand All @@ -190,11 +203,16 @@ func GenerateWithOptions(tomlData []byte, packageName string, enableEnv bool, in
maxFileSize = DefaultMaxFileSize
}

if mode == "" {
mode = "static"
}

gen := generator.New(
generator.WithPackageName(packageName),
generator.WithEnvOverride(enableEnv),
generator.WithInputDir(inputDir),
generator.WithMaxFileSize(maxFileSize),
generator.WithMode(mode),
)

return gen.Generate(tomlData)
Expand Down
8 changes: 8 additions & 0 deletions cmd/cfgx/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ var (
packageName string
noEnv bool
maxFileSize string
mode string
)

func main() {
Expand Down Expand Up @@ -104,6 +105,11 @@ var generateCmd = &cobra.Command{
return fmt.Errorf("--out flag is required")
}

// Validate mode
if mode != "static" && mode != "getter" {
return fmt.Errorf("invalid --mode value %q: must be 'static' or 'getter'", mode)
}

// Parse max file size
maxFileSizeBytes, err := parseFileSize(maxFileSize)
if err != nil {
Expand All @@ -117,6 +123,7 @@ var generateCmd = &cobra.Command{
PackageName: packageName,
EnableEnv: !noEnv,
MaxFileSize: maxFileSizeBytes,
Mode: mode,
}

if err := cfgx.GenerateFromFile(opts); err != nil {
Expand Down Expand Up @@ -155,6 +162,7 @@ func init() {
generateCmd.Flags().StringVarP(&packageName, "pkg", "p", "", "package name (default: inferred from output path or 'config')")
generateCmd.Flags().BoolVar(&noEnv, "no-env", false, "disable environment variable overrides")
generateCmd.Flags().StringVar(&maxFileSize, "max-file-size", "1MB", "maximum file size for file: references (e.g., 10MB, 1GB, 512KB)")
generateCmd.Flags().StringVar(&mode, "mode", "static", "generation mode: 'static' (values baked at build time) or 'getter' (runtime env var overrides)")

generateCmd.MarkFlagRequired("out")

Expand Down
1 change: 1 addition & 0 deletions example/gen.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
package main

//go:generate go run ../cmd/cfgx/main.go generate --in config/config.toml --out config/config.go --pkg config
//go:generate go run ../cmd/cfgx/main.go generate --in config/config.toml --out getter_config/config.go --pkg getter_config --mode getter
Loading
Loading