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.