Derive Macro model_mapper_macros::Mapper
source · #[derive(Mapper)]
{
// Attributes available to this derive:
#[mapper]
}
Expand description
Derives From and/or TryFrom another type to this one, or vice versa.
A mapper attribute is required at type-level and it’s optional at field or variant level.
Attributes can be set directly if only one type is involved in the conversion:
ⓘ
#[mapper(from, into, ty = OtherType, ignore(field = field_1), ignore(field = field_2))]Or they can be wrapped in a derive attribute to allow for multiple types:
ⓘ
#[mapper(derive(try_from, ty = OtherType, ignore(field = field_1)))]
#[mapper(derive(into, ty = YetAnotherType))]If multiple types are involved, both variant and field level attributes can also be wrapped in a when attribute
and must set the ty they refer to:
ⓘ
#[mapper(when(ty = OtherType, try_with = with::try_remove_option))]
#[mapper(when(ty = YetAnotherType, skip))]The following attributes are available:
Type level attributes
ty = String(mandatory): The other type to derive the conversionignore_extra(optional): Wether to ignore all extra fields (for structs) or variants (for enums) of the other type *ignore(optional, multiple): Additional fields (for structs with named fields) or variants (for enums) the other type has and this one doesn’t *field = String(mandatory): The field or variant to ignoredefault = Expr(optional): The default value (defaults toDefault::default())
from(optional): Wether to derive From the other type for selfinto(optional): Wether to derive From self for the other typetry_from(optional): Wether to derive TryFrom the other type for selftry_into(optional): Wether to derive TryFrom self for the other type
Variant level attributes
ignore_extra(optional): Wether to ignore all extra fields of the other variant (only valid for from and try_from) *ignore(optional, multiple): Additional fields of the variant that the other type variant has and this one doesn’t *field = String(mandatory): The field or variant to ignoredefault = Expr(optional): The default value (defaults toDefault::default())
skip(optional): Wether to skip this variant because the other enum doesn’t have it *default = Expr(optional): If skipped, the default value to populate this variant (defaults toDefault::default())rename = "OtherVariant"(optional): To rename this variant on the other enum
Field level attributes
skip(optional): Wether to skip this field because the other type doesn’t have it *default = Expr(optional): If skipped, the default value to populate this field (defaults toDefault::default())rename = "other_field"(optional): To rename this field on the other typewith = mod::my_function(optional): If the field type doesn’t implement Into the other, this property allows you to customize the behavior by providing a conversion functiontry_with = mod::my_function(optional): If the field type doesn’t implement TryInto the other, this property allows you to customize the behavior by providing a conversion function
* When ignoring or skipping fields or variants it might be required that the enum or the field type implements Default in order to properly populate it if no default is provided.
Examples
#[derive(Mapper)]
#[mapper(try_from, into, ty = ResponseModel, ignore(field = Unknown, default = CustomResponse::Empty))]
pub enum CustomResponse {
Empty,
#[mapper(rename = Text)]
Message(String),
#[mapper(ignore(field = internal))]
Data {
id: i64,
#[mapper(rename = "text")]
message: String,
#[mapper(with = with::option)]
#[mapper(try_with = with::try_option)]
status: Option<i16>,
#[mapper(skip)]
random: bool,
},
#[mapper(skip)]
Error,
}