Mapper

Derive Macro Mapper 

Source
#[derive(Mapper)]
{
    // Attributes available to this derive:
    #[mapper]
}
Expand description

Derive mapper functions to convert between types.

A mapper attribute is required at type-level and it’s optional at field or variant level.

The following attributes are available:

§Type level attributes
  • ty = PathType (mandatory): The other type to derive the conversion
  • from (optional): Whether to derive From the other type for self
    • custom (optional): Derive a custom function instead of the trait
    • custom = from_other (optional): Derive a custom function instead of the trait, with the given name
  • into (optional): Whether to derive From self for the other type
    • custom (optional): Derive a custom function instead of the trait
    • custom = from_other (optional): Derive a custom function instead of the trait, with the given name
  • try_from (optional): Whether to derive TryFrom the other type for self
    • custom (optional): Derive a custom function instead of the trait
    • custom = from_other (optional): Derive a custom function instead of the trait, with the given name
  • try_into (optional): Whether to derive TryFrom self for the other type
    • custom (optional): Derive a custom function instead of the trait
    • custom = from_other (optional): Derive a custom function instead of the trait, with the given name
  • add (optional, multiple): Additional fields (for structs with named fields) or variants (for enums) the other type has and this one doesn’t ¹
    • field = other_field (mandatory): The field or variant name
    • ty = bool (optional): The field type, mandatory for into and try_into if no default value is provided
    • default (optional): The field or variant will be populated using Default::default() (mandatory for enums, with or without value)
      • value = true (optional): The field or variant will be populated with the given expression instead
  • ignore_extra (optional): Whether to ignore all extra fields (for structs) or variants (for enums) of the other type ²
§Variant level attributes
  • rename = OtherVariant (optional): To rename this variant on the other enum
  • add (optional, multiple): Additional fields of the variant that the other type variant has and this one doesn’t ¹
    • field = other_field (mandatory): The field name
    • ty = bool (optional): The field type, mandatory for into and try_into if no default value is provided
    • default (optional): The field or variant will be populated using Default::default()
      • value = true (optional): The field or variant will be populated with the given expression instead
  • skip (optional): Whether to skip this variant because the other enum doesn’t have it
    • default (mandatory): The field or variant will be populated using Default::default()
      • value = get_default_value() (optional): The field or variant will be populated with the given expression instead
  • ignore_extra (optional): Whether to ignore all extra fields of the other variant (only valid for from and try_from) ²
§Field level attributes
  • rename = other_name (optional): To rename this field on the other type
  • skip (optional): Whether to skip this field because the other type doesn’t have it
    • default (optional): The field or variant will be populated using Default::default()
      • value = get_default_value() (optional): The field or variant will be populated with the given expression instead

Additional hints on how to map fields:

  • opt (optional): The field is an Option and the inner value shall be mapped ³
  • iter (optional): The field is an iterator and the inner value shall be mapped ³
  • map (optional): The field is a hashmap-like iterator and the inner value shall be mapped ³
  • with = mod::my_function (optional): If the field type doesn’t implement Into or TryInto the other, this property allows you to customize the behavior by providing a conversion function
  • from_with = mod::my_function (optional): The same as above but only for the from or try_from derives
  • from_with = mod::my_function (optional): The same as above but only for the from or try_from derives

¹ When providing additional fields without defaults, the From and TryFrom traits can’t be derived and a custom function will be required instead. When deriving into or try_into, the ty must be provided as well.

² When ignoring fields or variants it might be required that the enum or the struct implements Default in order to properly populate it.

³ Hints can be nested, for example: opt(vec), vec(opt(with = "my_custom_fn"))

§Example

#[derive(Mapper)]
#[mapper(from, ty = Entity)]
pub struct Model {
    id: i64,
    name: String,
    #[mapper(skip(default))]
    surname: Option<String>,
}

Other advanced use cases are available on the examples folder.