#conversion #proc-macro #macro #convert

default-conversion

一个 derive 宏,用于自动实现相似结构之间的转换

2 个不稳定版本

0.2.0 2020年10月20日
0.1.0 2020年10月19日

#295 in #conversion

MIT/Apache

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