3个版本
| 0.1.2 | 2023年3月23日 | 
|---|---|
| 0.1.1 | 2023年2月28日 | 
| 0.1.0 | 2023年1月30日 | 
1290 在 Rust模式
每月下载量 199
18KB
154 行
转换器实现助手宏库
该crate是一个声明性宏库,帮助您为您的类型实现From或TryFrom特质。
实现From特质
from宏帮助您实现From特质。
from!((src: SourceType) -> TargetType {
    ...
});
上面的代码将生成以下代码。
impl From<SourceType> for TargetType {
    fn from(src: SourceType) -> Self {
        ...
    }
}
您还可以使用as struct或as enum关键字在结构体类型或枚举类型之间进行转换。以下是一些示例。
use impl_converter_helper::*;
#[derive(Debug, PartialEq, Eq)]
struct StructA { num: i32 }
#[derive(Debug, PartialEq, Eq)]
struct StructB { num: i64, text: String }
#[derive(Debug, PartialEq, Eq)]
enum EnumA { Case1, Case2(i32), Case3(StructA), Case4(String) }
#[derive(Debug, PartialEq, Eq)]
enum EnumB { Case1, Case2(i64), Case3(StructB), CaseX(String) }
// convert struct to struct
from!((src: StructA) -> StructB as struct {
    num,
    text: format!("num = {}", src.num),
});
assert_eq!(StructB { num: 123, text: "num = 123".into() }, StructA { num: 123 }.into());
// convert enum to enum
from!((src: EnumA) -> EnumB as enum {
    Case1,
    Case2(n),
    Case3(x),
    Case4(s) => Self::CaseX(s),
});
assert_eq!(EnumB::Case2(321), EnumA::Case2(321).into());
// convert anyway
from!((src: StructA) -> EnumA {
    Self::Case2(src.num)
});
assert_eq!(EnumA::Case2(111), StructA { num: 111 }.into());
实现TryFrom特质
try_from宏帮助您实现TryFrom特质。
try_from!((src: SourceType) -> <TargetType, ErrorType> {
    ...
});
上面的代码将生成以下代码。
impl TryFrom<SourceType> for TargetType {
    type Error = ErrorType;
    fn try_from(src: SourceType) -> Result<Self, Self::Error> {
        ...
    }
}
您还可以使用as struct或as enum关键字在结构体类型或枚举类型之间进行转换。以下是一些示例。
use impl_converter_helper::*;
#[derive(Debug, PartialEq, Eq)]
struct StructA { num: i32 }
#[derive(Debug, PartialEq, Eq)]
struct StructB { num: i64, text: String }
#[derive(Debug, PartialEq, Eq)]
enum EnumA { Case1, Case2(i32), Case3(StructA), Case4(String) }
#[derive(Debug, PartialEq, Eq)]
enum EnumB { Case1, Case2(i64), Case3(StructB) }
// convert struct to struct
try_from!((src: StructA) -> <StructB, anyhow::Error> as struct {
    num,
    text: format!("num = {}", src.num),
});
assert_eq!(StructB { num: 123, text: "num = 123".into() }, StructA { num: 123 }.try_into().unwrap());
// convert enum to enum
try_from!((src: EnumA) -> <EnumB, anyhow::Error> as enum {
    Case1,
    Case2(n),
    Case3(x),
    Case4(s) => Err(anyhow::anyhow!("error")),
});
assert_eq!(EnumB::Case2(321), EnumA::Case2(321).try_into().unwrap());
// convert anyway
try_from!((src: StructA) -> <EnumA, anyhow::Error> {
    Ok(Self::Case2(src.num))
});
assert_eq!(EnumA::Case2(111), StructA { num: 111 }.try_into().unwrap());