mirror of
https://github.com/taigrr/jety.git
synced 2026-04-02 03:19:03 -07:00
cd/fix-set-env-prefix
SetEnvPrefix was broken: it set the prefix string but never re-read environment variables. This meant collapse() and SetDefault() couldn't match prefixed env vars to their unprefixed config keys, so defaults always won over env vars. The fix makes SetEnvPrefix behave identically to WithEnvPrefix: it re-reads os.Environ(), strips the prefix from matching keys, and stores the stripped keys in envConfig. The envPrefix field is removed entirely since keys are always pre-stripped. BREAKING CHANGE: SetEnvPrefix now filters env vars to only those matching the prefix (previously all env vars were accessible). This matches the documented and expected behavior.
JETY
JSON, ENV, TOML, YAML
A lightweight Go configuration management library supporting JSON, ENV, TOML, and YAML formats.
It provides viper-like AutomaticEnv functionality with fewer dependencies.
Originally built to support grlx.
Installation
go get github.com/taigrr/jety
Requires Go 1.25.5 or later.
Quick Start
package main
import "github.com/taigrr/jety"
func main() {
// Set defaults
jety.SetDefault("port", 8080)
jety.SetDefault("host", "localhost")
// Environment variables are loaded automatically
// e.g., PORT=9000 overrides the default
// Read from config file
jety.SetConfigFile("config.toml")
jety.SetConfigType("toml")
if err := jety.ReadInConfig(); err != nil {
// handle error
}
// Get values (config file > env > default)
port := jety.GetInt("port")
host := jety.GetString("host")
}
Features
- Multiple formats: JSON, TOML, YAML
- Automatic env loading: Environment variables loaded on init
- Prefix filtering: Filter env vars by prefix (e.g.,
MYAPP_) - Case-insensitive keys: Keys normalized to lowercase
- Type coercion: Getters handle type conversion gracefully
- Thread-safe: Safe for concurrent access
- Config precedence: config file > environment > defaults
Nested Configuration
For nested config structures like:
[services.cloud]
var = "xyz"
timeout = "30s"
[services.cloud.auth]
client_id = "abc123"
Access nested values using GetStringMap and type assertions:
services := jety.GetStringMap("services")
cloud := services["cloud"].(map[string]any)
varValue := cloud["var"].(string) // "xyz"
// For deeper nesting
auth := cloud["auth"].(map[string]any)
clientID := auth["client_id"].(string) // "abc123"
Environment Variable Overrides
Environment variables use uppercase keys. For nested config, the env var name is the key in uppercase:
# Override top-level key
export PORT=9000
# For nested keys, use the full key name in uppercase
export SERVICES_CLOUD_VAR=override_value
With a prefix:
cm := jety.NewConfigManager().WithEnvPrefix("MYAPP_")
export MYAPP_PORT=9000
export MYAPP_SERVICES_CLOUD_VAR=override_value
Note: Environment variables override defaults but config files take highest precedence.
Migration Guide
From v0.x to v1.x
Breaking Changes
-
WriteConfig()now returnserror// Before jety.WriteConfig() // After if err := jety.WriteConfig(); err != nil { // handle error } // Or if you want to ignore the error: _ = jety.WriteConfig() -
Go 1.25.5 minimum required
Update your Go version or pin to an older jety release.
Non-Breaking Improvements
- Getters (
GetBool,GetInt,GetDuration) now return zero values instead of panicking on unknown types - Added
int64support inGetInt,GetIntSlice, andGetDuration - Improved env var parsing (handles values containing
=)
API
Configuration
| Function | Description |
|---|---|
SetConfigFile(path) |
Set config file path |
SetConfigDir(dir) |
Set config directory |
SetConfigName(name) |
Set config file name (without extension) |
SetConfigType(type) |
Set config type: "toml", "yaml", "json" |
ReadInConfig() |
Read config file |
WriteConfig() |
Write config to file |
Values
| Function | Description |
|---|---|
Set(key, value) |
Set a value |
SetDefault(key, value) |
Set a default value |
Get(key) |
Get raw value |
GetString(key) |
Get as string |
GetInt(key) |
Get as int |
GetBool(key) |
Get as bool |
GetDuration(key) |
Get as time.Duration |
GetStringSlice(key) |
Get as []string |
GetIntSlice(key) |
Get as []int |
GetStringMap(key) |
Get as map[string]string |
Environment
| Function | Description |
|---|---|
WithEnvPrefix(prefix) |
Filter env vars by prefix (strips prefix from keys) |
SetEnvPrefix(prefix) |
Set prefix for env var lookups |
License
See LICENSE file.
Languages
Go
100%