Skip to content

Latest commit

 

History

History
69 lines (52 loc) · 2.46 KB

README.md

File metadata and controls

69 lines (52 loc) · 2.46 KB

Config

Simple configuration module. By default, it will load a configuration from a file (optional, can be either JSON or YAML if provided), env vars, then flags. A special flag will be exposed for your app "-configFile" which lets the app declare where to find a JSON or YAML config file.

Usage

First, create a struct that is a composition of config.BaseConfiguration, along with your other configuration attributes:

type ExampleConfig struct {
	config.BaseConfiguration
	Text      string
}

Then, call config.Load on a pointer ref to an instance of the newly-created struct. Ensure any property in the instance is initialized to what you want the default value of that field to be. Any slice should be initialize to an empty slice for best results:

tc := ExampleConfig{
    Text: "defaultText",
}
cfg, err := config.Load(&tc)
if err != nil {
    log.Fatal(err)
}

tcResult := cfg.(*ExampleConfig)

In this example, it will load a config file from wherever the -configFile flag references. If it is not present, a config file will not be loaded. If loaded, any value that is non-blank in the file will overwrite the matching value from the configuration instance initially passed.

Then, environment variables will be applied to the configuration. For each property, the environment variable is the upper-case name of the property, where dots are replaced with underscores. So something like "OAuth.clientId" will be OAUTH_CLIENTID.

Finally, any flag (CLI argument) will be applied. Each property is the dot property, where the dot is replaced by a dash. So, something like "database.url" would be database-url as a flag.

Using a Default Config File Path

To provide a default config file (to not require a flag/cli arg), you can initialize your config instance with BaseConfiguration.ConfigFile:

tc := ExampleConfig{
    BaseConfiguration: config.BaseConfiguration{
        ConfigFile: "./config.json",
    },
    Text: "",
}

Environment Variable Prefixes

For environment variables, this module also supports an environment variable prefix. To use this feature, provide a second argument for config.Load (the uppercase value of what is provided will be used, with a trailing underscore):

cfg, err := config.Load(&tc, "myapp")

This will make something like "MYAPP_TEXT" correspond to the "Text" property in the examples above. Usage of this feature is recommended so as not to collide with system environment variables as easily.