Structs & enums
The Config trait can be derived for structs and enums.
#![allow(unused)] fn main() { #[derive(Config)] struct AppConfig { pub base: String, pub port: usize, pub secure: bool, pub allowed_hosts: Vec<String>, } #[derive(Config)] enum Host { Local, Remote(HostConfig), } }
Enum caveats
Config can only be derived for enums with tuple or unit variants, but not struct/named
variants. Why not struct variants? Because with this pattern, the enum acts like a union type. This
also allows for Config functionality, like partials, merging, and validation, to be
applied to the contents of each variant.
If you’d like to support unit-only enums, you can use the
ConfigEnumtrait instead.
Attribute fields
The following fields are supported for the #[config] container attribute:
allow_unknown_fields- Removes the serdedeny_unknown_fieldsfrom the partial struct. Defaults tofalse.context- Sets the struct to be used as the context. Defaults toNone.env_prefix- Sets the prefix to use for environment variable mapping. Defaults toNone.serde- A nested attribute that sets tagging related fields for the partial. Defaults toNone.
#![allow(unused)] fn main() { #[derive(Config)] #[config(allow_unknown_fields, env_prefix = "EXAMPLE_")] struct ExampleConfig { // ... } }
And the following for serde compatibility:
renamerename_all- Defaults tocamelCase.
Serde support
By default the Config macro will apply the following #[serde] to the
partial struct. The default and deny_unknown_fields ensure proper parsing and
layer merging.
#![allow(unused)] fn main() { #[serde(default, deny_unknown_fields, rename_all = "camelCase")] }
However, the deny_unknown_fields and rename_all fields can be customized, and we also support
the rename field, both via the top-level #[config] attribute.
#![allow(unused)] fn main() { #[derive(Config)] #[config(allow_unknown_fields, rename = "ExampleConfig", rename_all = "snake_case")] struct Example { // ... } }
These values can also be applied using
#[serde], which is useful if you want to apply them to the main struct as well, and not just the partial struct.