#macro-derive #proc-macro #convert #struct #generate #try #target

derive-try-from-ref

生成 TryFrom<&T> 实现的 derive 宏

1 个不稳定版本

0.1.0 2024年1月17日

#69 in #try

Download history 58/week @ 2024-03-28 32/week @ 2024-04-04 21/week @ 2024-04-11 20/week @ 2024-04-18 44/week @ 2024-04-25 58/week @ 2024-05-02 92/week @ 2024-05-09 83/week @ 2024-05-16 101/week @ 2024-05-23 59/week @ 2024-05-30 91/week @ 2024-06-06 53/week @ 2024-06-13 32/week @ 2024-06-20 47/week @ 2024-06-27 11/week @ 2024-07-04 1/week @ 2024-07-11

102 每月下载量
3 个crate中使用了(通过 odra-macros

MIT 许可证

16KB
230 代码行

Crates.io License: MIT

描述

此crate提供了一个过程宏,用于为目标结构体实现 TryFrom<&Struct>。它有助于将较大的结构体转换为几个较小的、更专业的结构体。宏展开为一个 TryFrom 实现尝试将目标结构体的每个字段从整个源结构体转换。如果转换失败,宏返回一个错误。

用法

use try_from_ref::TryFromRef;

struct Source {
    x: u32,
    y: u32,
    name: String,
    description: String,
}

#[derive(derive_try_from::TryFromRef)]
#[source(Source)]
#[err(&'static str)]
struct Target {
    sum: Sum,
    meta: Metadata,
    #[default]
    is_dirty: bool,
}

展开为

#[automatically_derived]
impl ::core::convert::TryFrom<&'_ Source> for Target {
    type Error = &'static str;
    fn try_from(input: &'_ Source) -> ::core::result::Result<Self, Self::Error> {
        Ok(Self {
            sum: input.try_into()?,
            meta: input.try_into()?,
            is_dirty: Default::default(),
        })
    }
}

在结构体级别,需要两个属性

  • #[source(SourceType)] - 源结构体的名称
  • #[err(ErrorType)] - 转换失败时返回的错误类型

在字段级别,还支持另外两个属性

  • #[default] - 跳过转换,设置类型的默认值
  • #[expr(expression)] - 用于获取字段值的表达式

MSRV(最低支持的Rust版本)

最低支持的Rust版本是1.60.0。

依赖项

~310–770KB
~18K SLoC