17 个版本 (破坏性)
0.13.0 | 2024 年 3 月 11 日 |
---|---|
0.11.0 | 2024 年 3 月 10 日 |
#312 in Rust 模式
6,641 每月下载量
21KB
327 行
structural-convert
当项结构相似时派生转换特质。
灵感来源于 serde 和 struct-convert 仓库。
特性
- 为 From、Into、TryFrom、TryInto 派生一对一字段映射
- From
- Into
- TryFrom
- TryInto
- 使用
.into()
/.try_into()
进行内部字段类型转换 - 重命名枚举变体和命名字段
- 跳过枚举变体和命名字段
- 回退到默认枚举变体
- 命名字段转换回退到默认值
- 枚举不匹配的变体回退到枚举默认值
- 结构体命名字段仅限 - 使用
as
属性进行中间人类型转换 - 处理 std 类型
Option
Result
- 来自
std::collections
的类型,如 Vec、HashMap 等...
特性愿望清单
- 实现未命名字段的属性(默认、跳过、as)
- 处理
Type
到Option<Type>
- 添加更多关于 try 错误的数据,并提供注入自己的错误类型的能力
示例
请查看测试文件夹中的更多示例,但以下是一些样本
结构体
#[derive(Debug, PartialEq)]
struct Rhs {
z: i8,
x: u32,
}
#[derive(Debug, PartialEq, StructuralConvert)]
#[convert(from(Rhs))]
struct Lhs {
z: i32,
x: u32,
}
assert_eq!(Lhs { z: 1, x: 2 }, Rhs { z: 1, x: 2 }.into());
assert_eq!(Lhs { z: 1, x: 2 }, Rhs { z: 1, x: 2 }.into());
生成的代码
impl From<Rhs> for Lhs {
fn from(value: Rhs) -> Self {
match value {
Rhs { z, x } => Lhs {
z: z.into(),
x: x.into(),
},
}
}
}
枚举
#[derive(Debug, PartialEq)]
enum Rhs {
A { z: i8, x: u32 },
}
#[derive(Debug, PartialEq, StructuralConvert)]
#[convert(from(Rhs))]
enum Lhs {
A { z: i32, x: u32 },
}
assert_eq!(Lhs::A { z: 1, x: 2 }, Rhs::A { z: 1, x: 2 }.into());
生成的代码
impl From<Rhs> for Lhs {
fn from(value: Rhs) -> Self {
match value {
Rhs::A { z, x } => Lhs::A {
z: z.into(),
x: x.into(),
},
}
}
}
依赖项
~2MB
~43K SLoC