2 个不稳定版本
0.2.0 | 2020年10月20日 |
---|---|
0.1.0 | 2020年10月19日 |
#295 in #conversion
8KB
74 行
default-conversion-rs
具有相同字段名称的结构体的默认转换
我发现这种方法与这个crate做相同的工作: https://stackoverflow.com/questions/57477967/how-can-i-use-serde-to-serialize-a-struct-to-another-rust-data-structure
但显然,我用 From 做这个更快: https://github.com/serde-rs/json/issues/724
为什么我创建了它?
一些使用 derive proc macros 的项目需要分离的结构体,具有相似的结构,以实现不同的功能。例如
- 一个 API,其输入结构体与模型有一些相同的字段。
使用方法
default-conversion = "0.1.0"
示例
开发者代码
struct B {
a: i32,
};
#[derive(IntoDefault)]
#[IntoStruct(B)]
struct InputB {
a: i32,
};
struct A {
a: String,
b: i32,
c: B
};
#[derive(IntoDefault)]
#[IntoStruct(A)]
struct InputA {
a: String,
b: i32,
#[IntoType(B)]
c: InputB
};
let a = InputA {
a: String::from("test"),
b: 2,
c: InputB {
a: 3
}
};
let b = A::from(a);
展开代码
struct B {
a: i32,
};
#[derive(IntoDefault)]
#[IntoStruct(B)]
struct InputB {
a: i32,
};
impl From<InputB> for B {
fn from(item: InputB) -> Self {
B {
a: item.a.into()
}
}
}
struct A {
a: String,
b: i32,
c: B
};
#[derive(IntoDefault)]
#[IntoStruct(A)]
struct InputA {
a: String,
b: i32,
#[IntoType(B)]
c: InputB
};
impl From<InputA> for A {
fn from(item: InputA) -> Self {
A {
a: item.a.into(),
b: item.b.into(),
c: item.c.into()
}
}
}
let a = InputA {
a: String::from("test"),
b: 2,
c: InputB {
a: 3
}
};
let b = A::from(a);
完整示例在 tests/basic_struct.rs
说明
详细说明在文档中(很快)。
IntoDefault
是主要的 derive 宏,用于调用 from 实现。
IntoStruct
是属性 proc 宏,用于定义我们想要实现转换的类型。 #[IntoStruct(TYPE_OF_STRUCT)]
支持的功能
- 与原始类型的转换。
- 与复杂类型的转换。
- 根据需要自动转换为 Option 或 Object。
- 与不同类型的向量进行转换
下一步
- 示例
- 更好的测试
- 文档
依赖项
~2MB
~42K SLoC