Module value

Module value 

Source
Expand description

Deserialization of a Value<T> type which tracks where it was deserialized from.

§Rationale for Value<T>

Often Cargo wants to report semantic error information or other sorts of error information about configuration keys but it also may wish to indicate as an error context where the key was defined as well (to help user debugging). The Value<T> type here can be used to deserialize a T value from configuration, but also record where it was deserialized from when it was read.

Deserializing Value<T> is pretty special, and serde doesn’t have built-in support for this operation. To implement this we extend serde’s “data model” a bit. We configure deserialization of Value<T> to basically only work with our one deserializer using configuration.

§How Value<T> deserialization works

Value<T> uses a custom protocol to inject source location information into serde’s deserialization process:

Magic identifiers: Value<T>::deserialize requests a struct with special name and field names that use invalid Rust syntax to avoid conflicts. This signals to Cargo’s deserializer that location tracking is needed.

Custom deserializer response: When Cargo’s deserializer sees these magic identifiers, it switches to ValueDeserializer (from the de module) instead of normal struct deserialization.

Two-field protocol: ValueDeserializer presents exactly two fields through map visiting:

  • The actual value (deserialized normally)
  • The definition context (encoded as a (u32, String) tuple acting as a tagged union of Definition variants)

This allows Value<T> to capture both the deserialized data and where it came from.

Note: When modifying Definition variants, be sure to update both the Definition::deserialize implementation here and the MapAccess::next_value_seed implementation in ValueDeserializer.

Structs§

DefinitionKey 🔒
FieldVisitor 🔒
Value
A type which can be deserialized as a configuration value which records where it was deserialized from.
ValueKey 🔒

Enums§

Definition
Location where a config value is defined.

Constants§

DEFINITION_FIELD 🔒
NAME 🔒
VALUE_FIELD 🔒

Statics§

FIELDS 🔒

Type Aliases§

OptValue