Skip to main content

DeepModel

Derive Macro DeepModel 

#[derive(DeepModel)]
{
    // Attributes available to this derive:
    #[DeepModelTy]
}
Expand description

The derive macro for the DeepModel trait.

This macro can be used to implement DeepModel by recursively delegating into DeepModel of each individual field. For a struct, it generates a new struct and for an enum it generates a new enum. Other types are not supported. The generated type is named the same as the type this is derived for with the DeepModel suffix appended to it.

The visibility of the generated types and their fields will be the same (including the non_exhaustive attribute, if present) and the types of the fields will be the DeepModelTy of the corresponding field. For instance, pub struct Foo { bar: u32 } will become pub struct FooDeepModel { bar: Int }.

To avoid exposing private fields, the generated deep_model method will have openess restricted to the most restrictive visibility of the type. If the type is public but its field is private, the resulting openess will be private. #[non_exhaustive] acts as if the type had an additional pub(crate) field. The visibility is computed as intersection, so paths super::super and super will become super. If the visibility cannot be computed precisely a conservative default is used - the private visibility. Therefore it’s not recommended to mix styles of specifying the visibility - either use relative (super::super::...) or absolute (crate::foo::bar) in all items.

While this works well for structs that are either fully private or fully public, mixed visibility has the consequence that your downstream users may have hard time verifying their code because it won’t see the relationship between the fields of struct and its deep model. This cannot be solved automatically and in such case a more precise manual implementation may be required.