confy
is your one stop shop for configuration, it allows configuration from multiple sources including command-line arguments, environment variables, and configuration files in various formats (JSON
,YAML
,TOML
).
- Multiple Configuration Sources: Populate settings fromCLI flags,environment variables, andconfig files.
- Automatic CLI Flag and Env Variable Mapping: Fields are mapped automatically and can be renamed with the
confy:""
tag - Support for YAML, JSON, and TOML: Automatically detect and parse configuration file format, no added effort to switch to a new format
go get github.com/NHAS/confy
confy:"field_name;sensitive"
: Customize field names for env variables, CLI flags, and config files.confy_description:"Field Description here"
: Set field descriptions for CLI parsing and help messages.
config.json
:
{"Database": {"Host":"localhost","Port":5432,"User":"dbuser","Password":"securepassword" },"new_name":"some_value"}
config.yaml
:
Database:Host:"localhost"Port:5432User:"dbuser"Password:"securepassword"new_name:"some_value"
package mainimport ("fmt""github.com/NHAS/confy")typeConfigstruct {Databasestruct {Hoststring`confy_description:"Database host address"`PortintUserstringPasswordstring}Renamedstring`confy:"new_name"`}funcmain() {// Defaults will also load from env and cli!loadedConfig,_,err:= confy.Config[Config](confy.Defaults("config","config.json"))iferr!=nil {if!errors.Is(err,flag.ErrHelp) {fmt.Println("Error loading config:",err)}return}fmt.Printf("Loaded JSON config: %+v\n",loadedConfig)yamlLoadedConfig,_,err:= confy.Config[Config](confy.Defaults("config","config.yaml"))iferr!=nil {fmt.Println("Error loading config:",err)return}fmt.Printf("Loaded YAML config: %+v\n",yamlLoadedConfig)// They're the same!}
Output
$ ./programLoaded JSON config: {Database:{Host:localhost Port:5432 User:dbuser Password:securepassword} Renamed:some_value}Loaded YAML config: {Database:{Host:localhost Port:5432 User:dbuser Password:securepassword} Renamed:some_value}$ ./program -hUsage of ./testconfy: -config string config file path (default"config.json")Structure options: -Database.Host string Database host address -Database.Password string A string value, Database.Password (Database.Password) -Database.Port int A int value, Database.Port (Database.Port) -Database.User string A string value, Database.User (Database.User) -config string config file path (default"config.json") -new_name string A string value, Renamed (new_name) -struct-help Printcommand line flags generated by confy (default true)
For struct:
package mainimport ("fmt""github.com/NHAS/confy")typeConfigstruct {Serverstruct {Hoststring }}funcmain() {populatedConfig,_,err:= confy.Config[Config](confy.FromEnvs(confy.ENVDelimiter))iferr!=nil {fmt.Println("Error loading config:",err)return}fmt.Println(populatedConfig.Server.Host)}
Expected environment variable:
export Server_Host="localhost"$ ./testlocalhost
For struct:
package mainimport ("fmt""github.com/NHAS/confy")typeConfigstruct {Databasestruct {Portint }}funcmain() {populatedConfig,_,err:= confy.Config[Config](confy.FromCli(confy.CLIDelimiter))iferr!=nil {fmt.Println("Error loading config:",err)return}fmt.Println(populatedConfig.Database.Port)}
Expected CLI flag:
$ ./app -Database.Port=54325432
Confy has logging capabilities using theslog
package. Use theWithLogLevel
option to adjust verbosity or disable logging.
Confy offers a variety of options for configuring your application's settings.
Option | Description |
---|
Defaults(...) | Loads configurations in the order: config file -> environment variables -> CLI flags. This sets a non-strict parsing mode for unknown fields in the config file. |
FromConfigFile(...) | Load configuration from a file. SupportsYAML ,JSON , andTOML . |
FromConfigBytes(...) | Load configuration from raw bytes, ideal for embedding configuration in code. |
FromConfigURL(...) | Load configuration from URL. SupportsYAML ,JSON , andTOML , use extension or content type to specify type when using auto keyword |
FromConfigFileFlagPath(...) | Load configuration from file with filepath specified as cli flag |
WithStrictParsing(...) | Parse config files in a strict way, do not allow unknown fields |
FromCli(...) | Load configuration from CLI flags. Set a delimiter for nested struct parsing. |
WithLogLevel(...) | Set logging level to control output verbosity. Useful for debugging. |
WithCliTransform(...) | Takes a function to run against the generated CLI flag name, allows you to modify the flag name |
WithEnvTransform(...) | Takes a function to run against the generated ENV variable name, allows you to modify the ENV name |
- Complex structures must implement
encoding.TextUnmarshaler
andencoding.TextMarshaler
for CLI/ENV parsing. - CLI flags and environment variables use the delimiters (
.
for CLI,_
for ENV by default) when handling nested fields.