Expand description
Opinionated utility to load a configuration from well defined layers into any type which can be deserialized by Serde using kebab-case.
First, values from the mandatory default configuration file at <CONFIG_DIR>/default.yaml
are
loaded.
Then, if the environment variable CONFIG_OVERLAYS
is defined, its comma separated overlays
(e.g. “prod” or “feat, dev”) at <CONFIG_DIR>/<overlay>.yaml
are loaded from left to right as
overlays, i.e. adding or overwriting already existing values.
Finally environment variables prefixed with <CONFIG_ENV_PREFIX>__
and segments separated by
__
(double underscores are used as segment separators to allow for single underscores in
segment names) are used as final overlay.
§Example
use configured::{ CONFIG_DIR, CONFIG_OVERLAYS, Configured, Error };
use serde::Deserialize;
use std::env;
#[derive(Debug, Deserialize)]
#[serde(rename_all = "kebab-case")]
struct Config {
foo: Foo,
qux: Qux,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "kebab-case")]
struct Foo {
bar: String,
baz: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "kebab-case")]
struct Qux {
quux: String,
corge_grault: String,
}
fn test_load() -> Result<(), Error> {
env::set_var(CONFIG_DIR, "test-config");
env::set_var(CONFIG_OVERLAYS, "feat, dev");
env::set_var("APP__QUX__CORGE_GRAULT", "corge-grault-env");
let config = Config::load()?;
assert_eq!(config.foo.bar.as_str(), "bar");
assert_eq!(config.foo.baz.as_str(), "baz-dev");
assert_eq!(config.qux.quux.as_str(), "quux-feat");
assert_eq!(config.qux.corge_grault.as_str(), "corge-grault-env");
Ok(())
}
Enums§
- Error
- Possible errors when loading the configuration.
Constants§
- CONFIG_
DIR - Environment variable for the configuration directory; default is
"config"
. - CONFIG_
ENV_ PREFIX - Environment variable for the prefix of environment variable overrides.
- CONFIG_
OVERLAYS - Environment variable for the optional overlays (e.g. “prod” or “dev”).
Traits§
- Configured
- Use (import) this trait and all types that implement
Deserialize
are extended with theload
associated function.