12个稳定版本
1.1.4 | 2022年12月28日 |
---|---|
1.1.1 | 2022年12月27日 |
#309 in Rust模式
每月41次下载
21KB
120 行
mapper
此库提供了一种方便的 derive 宏,用于实现 mapper_api::Mapper 或 std::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 中指定的目标生成映射,仅映射注释字段。如果目标和使用策略已使用自动映射,则不能使用增量映射
映射策略
有两种映射策略可用
- mapper(default),映射源到目标而不消耗源,生成 mapper_api::Mapper 的实现
- 将源映射到目标,通过消耗源 std::convert::Into
到结构体属性
生成指定策略的自动映射。
- 您可以通过结构体设置多个到属性
- 在此属性中指定一个或多个目标类型:
#[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