12个稳定版本

1.1.4 2022年12月28日
1.1.1 2022年12月27日

#309 in Rust模式

每月41次下载

MIT/Apache

21KB
120

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 struct attributes 中指定的目标生成映射,如果未明确排除,则使用源的所有字段进行映射。如果目标和使用策略已使用增量映射,则不能使用自动映射
  • 增量,为在 to field attributes 中指定的目标生成映射,仅映射注释字段。如果目标和使用策略已使用自动映射,则不能使用增量映射

映射策略

有两种映射策略可用

到结构体属性

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

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

到字段属性

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

  • 您可以通过字段设置多个到属性
  • 如果只使用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}
    }
}

排除

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

  • 无条件排除,排除任何类型的映射字段,例如
#[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(<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

依赖项

~1.5MB
~36K SLoC