Module smart_config::de 
source · Expand description
Configuration deserialization logic.
§How it works
DeserializeConfig derive macro visits all config parameters invoking associated DeserializeParam
implementations. Unlike serde deserialization, deserialization does not stop early on error (we want to get
errors for all params). Nested / flattened configs do not use serde either for a couple of reasons:
- To reach all params regardless of encountered errors as mentioned above
- serdesometimes collects params in intermediate containers (e.g., in structs with- #[serde(flatten)]or in tagged enums), which leads to param deserialization potentially getting broken in unpredictable ways.
So, each config param is deserialized in isolation from an optional Value WithOrigin
encapsulated in DeserializeContext.
§Deserializers
The default deserializer is extracted from the param type with the help of WellKnown and WellKnownOption traits.
If you have a custom type defined locally which you want to use in configs, the easiest solution
would be to implement WellKnown (+ maybe WellKnownOption) for it.
Alternatively, it’s possible to specify a custom deserializer using #[config(with = _)] attribute.
§Universal deserializers
Serde (usually instantiated via the eponymous macro) can deserialize
any param implementing serde::Deserialize. An important caveat is that these deserializers require
the input Value to be present; otherwise, they’ll fail with a “missing value” error. As such,
for Optional types, it’s necessary to wrap a deserializer in the Optional decorator.
§Durations and byte sizes
Durations and ByteSizes can be deserialized in two ways:
- By default, they are deserialized from an integer + unit either encapsulated in a string like “200ms” or
in a single-key object like { "mb": 4 }. SeeWithUnitfor more details.
- Alternatively, TimeUnitandSizeUnitcan be used onDurations andByteSizes, respectively.
§Secrets
A param is secret iff it uses a Secret deserializer (perhaps, with decorators on top, like
Optional / WithDefault). Secret params must be deserializable from a string; this is because
strings are the only type of secret values currently supported.
Secret values are wrapped in opaque, zero-on-drop wrappers during source preprocessing so that
they do not get accidentally exposed via debug logs etc. See ConfigRepository
for details.
Macros§
- Constructor ofSerdetypes / instances.
Structs§
- Deserializer that supports either an array of values, or a string in which values are delimited by the specified separator.
- Context for deserializing a configuration.
- Available deserialization options.
- Deserializer from JSON objects.
- Deserializer for secret strings (any type convertible fromSecretString, includingSecretStringitself). Will set the corresponding flag forParamMetadata, making raw param value hidden in the debug output etc.
- Deserializer that supports either a map or an array of{ key: _, value: _ }tuples (with customizable key / value names). Created usingEntries::named().
- Deserializer decorator that wraps the output of the underlying decorator inSomeand returnsNoneif the input for the param is missing.
- Deserializer that supports parsing either from a default format (usually an object or array) viaDeserialize, or from string viaFromStr.
- Deserializer decorator that provides additional details for the deserialized type.
- Deserializer from JSON arrays.
- Deserializer for arbitrary secret params. Will set the corresponding flag forParamMetadata, making raw param value hidden in the debug output etc.
- Deserializer powered byserde. Usually created with the help ofSerde!macro; see its docs for the examples of usage.
- Deserializer decorator that defaults to the provided value if the input for the param is missing.
Traits§
- Customizes the well-known deserializer forOption<Self>, similarly toWellKnown.
- Deserializes this configuration from the provided context.
- Deserializes a parameter of the specified type.
- Collection that can iterate over its entries.
- Parameter type with well-known deserializer.
- Marker trait for types that use a conventionalOptionaldeserializer forOption<Self>.