#named-fields #mapping #convert #derive #map #from

structural-convert

当枚举或结构体字段结构相似时,派生转换特质(From、Into、TryFrom、TryInto)

17 个版本 (破坏性)

0.13.0 2024 年 3 月 11 日
0.11.0 2024 年 3 月 10 日

#312 in Rust 模式

Download history 115/week @ 2024-03-13 8/week @ 2024-03-20 97/week @ 2024-03-27 12/week @ 2024-04-03 37/week @ 2024-04-10 74/week @ 2024-04-24 1075/week @ 2024-05-01 1286/week @ 2024-05-08 2142/week @ 2024-05-15 1395/week @ 2024-05-22 2303/week @ 2024-05-29 2383/week @ 2024-06-05 1690/week @ 2024-06-12 1411/week @ 2024-06-19 693/week @ 2024-06-26

6,641 每月下载量

MIT 许可证

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)
  • 处理 TypeOption<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