2个稳定版本

1.0.2 2022年12月12日

#1355 in Rust模式


用于 2 crates

MIT/Apache

2KB

mapper

githubcrates-iodocs-rsmapper-ci

此库提供了一个方便的derive宏,用于实现mapper_api::Mapperstd::convert::Into特质,并生成映射而无需样板代码。


示例

use mapper::Mapper;

fn map_account_id(account_id: &u16) -> String{
    account_id.to_string()
}

#[derive(Mapper)]
#[to(Person)]
struct User{
    #[to(Person, field=_name)]
    pub name: String,
    #[to(Person, with=map_account_id)]
    pub account_id: u16,
    pub age: u8
}
struct Person{
    pub _name: String,
    pub account_id: String,
    pub age: u8
}

免责声明

  • 宏只在结构体上工作
  • Mapper不处理嵌套属性

默认行为

默认行为是取注解结构体的每个字段,并在目标结构体初始化器中通过实现mapper_api::Mapper特质来复制这些字段

#[derive(Mapper)]
#[to(Person)]
struct User{
    pub name: String
}
struct Person{
    pub name: String
}

生成 🔄

impl Mapper<Person> for User{
    fn to(&self)->Person{
        Person{name: self.name.clone()}
    }
}

映射类型

有两种映射类型可用

  • 自动,为在到结构体属性中指定的目标生成映射,如果未明确排除,则使用源的所有字段进行映射。如果目标和使用策略已使用增量映射,则不能使用自动映射
  • 增量,为在到字段属性中指定的目标生成映射,仅映射注解字段。如果目标和使用策略已使用自动映射,则不能使用增量映射

映射策略

有两种映射策略可用

到结构体属性

为指定的策略生成自动映射。

  • 您可以通过结构体设置多个to属性
  • 在此属性中指定一个或多个目标类型:#[to(Animal, Vehicle)]
  • 在此属性中指定一个或多个映射策略:#[to(Animal, strategy=into, strategy=mapper)]

字段属性

在父结构体上完成自动映射配置,或提供增量映射或排除字段从任何映射

  • 您可以通过字段设置多个to属性
  • 如果只使用DestinationType,则禁止此属性

DestinationType

映射目标类型。除非字段无条件排除,否则为必选参数。

泛型

您可以使用泛型指定目标类型,这些泛型应与src结构体的字段兼容

#[derive(Mapper)]
#[to(Person::<String, u8>)]
struct User {
    name: String,
    age: u8
}
struct Person<T, U> {
    name: T,
    age: U
}

策略

触发映射目标类型和指定策略的增量映射,例如

#[derive(Mapper)]
struct User(#[to(Person, strategy=into)]u16, String);
struct Person(u16);

生成 🔄

impl Into<Person> for User{
    fn into(self)->Person{
        Person{0:self.0}
    }
}

排除

可选参数,指定字段是否排除映射,有两种排除方式。

  • 无条件排除,排除任何类型的映射中的字段,例如
#[derive(Mapper)]
#[to(Person)]
struct User(u16, #[to(exclude)]String);
struct Person(u16);

生成 🔄

impl Mapper<Person> for User{
    fn into(self)->Person{
        Person{0:self.0}
    }
}
  • 针对特定目标的排除(⚠️对于增量映射不适用),排除特定目标映射中的字段,例如
#[derive(Mapper)]
#[to(Person,Account, strategy=into)]
struct User(u16, #[to(Person,exclude)]String);
struct Account(u16, String);
struct Person(u16);

生成 🔄

impl Into<Person> for User{
    fn into(self)->Person{
        Person{0:self.0}
    }
}
impl Into<Account> for User{
    fn into(self)->Account{
        Account{0:self.0, 1: self.1}
    }
}

字段

可选参数,指定目标类型字段,例如

#[derive(Mapper)]
#[to(Person)]
struct User{
    #[to(Person, field=0)
    name: String
};
struct Person( String);

生成 🔄

impl Mapper<Person> for User{
    fn to(&self)->Person{
        Person{0:self.name.clone()}
    }
}

With

可选参数,提供一个函数将注解字段转换为目标字段。您可以通过以下方式指定with函数使用的策略:with(<strategy>)如果使用with而不指定策略:with则默认使用mapper策略。函数的签名应与使用的策略相关

  • with(mapper) | with
fn foo_mapping(val: &<src_field_type>)-><dst_field_type>
  • with(into)
fn foo_mapping(val: <src_field_type>)-><dst_field_type>

泛型

如果泛型类型约束符合源字段类型和目标字段类型,您可以在函数中使用泛型

    fn gen_func<T: Display>(val: &T)->String{
        val.to_string()
    }
    #[derive(Mapper)]
    #[to(Person)]
    struct User {
        #[to(Person, with=gen_func)]
        age: u16,
    }
    struct Person {
        age: String,
    }

许可:MIT OR Apache-2.0


lib.rs:

githubcrates-iodocs-rs

此库提供由mapper crate使用的定义

无运行时依赖