#wrap #unwrap #type #stylish #enums #macro-derive #inner

macro giftwrap

以优雅的方式包装和解除包装您的类型

5个版本 (破坏性更新)

0.5.0 2022年10月20日
0.4.0 2022年9月12日
0.3.2 2022年9月6日
0.3.0 2021年10月4日
0.1.0 2021年4月25日

#8 in #stylish


valued 中使用

MIT/Apache

27KB
585

Giftwrap Crates

使用 derive 宏以优雅的方式包装和解除包装您的类型,同时支持双向 From/TryFrom

它如何工作?

giftwrap公开了两个 derive 宏,WrapUnwrap,分别派生 impl From<inner_type> for your_typeimpl From<your_type> for inner_type(或枚举情况下的 TryFrom<your_type>)。它适用于任何仅包含单个类型的结构体或枚举变体,无需担心具有多个类型或需要自行转换的类型,可以通过在 #[giftwrap()] 属性中设置 noWrapnoUnwrap 来轻松忽略变体。

示例

考虑以下 error.rs

pub type Result<T> = std::result::Result<T, Error>;

macro_rules! impl_from {
    ($wrapper:expr, $inner:ty) => {
        impl From<$inner> for Error {
            fn from(e: $inner) -> Error {
                $wrapper(e)
            }
        }
    };
}

#[derive(Debug)]
pub enum Error {
    Io(std::io::Error),
    RppalGpio(rppal::gpio::Error),
    Reqwest(reqwest::Error),
    Qr(Box<qrcodegen::DataTooLong>),
    Other(String),
}

impl_from!(Error::Io, std::io::Error);
impl_from!(Error::RppalGpio, rppal::gpio::Error);
impl_from!(Error::Reqwest, reqwest::Error);

impl From<qrcodegen::DataTooLong> for Error {
    fn from(f: qrcodegen::DataTooLong) -> Self {
        Error::Qr(f.into())
    }
}

impl From<Box<qrcodegen::DataTooLong>> for Error {
    fn from(f: Box<qrcodegen::DataTooLong>) -> Self {
        Error::Qr(f)
    }
}

这看起来可能足够简单,但添加新的错误类型并不像看起来那么简单。

然而,使用 giftwrap,这变得非常简单

pub type Result<T> = std::result::Result<T, Error>;

use giftwrap::Wrap;
#[derive(Debug, Wrap)]
pub enum Error {
    Io(std::io::Error),
    RppalGpio(rppal::gpio::Error),
    Reqwest(reqwest::Error),
    #[giftwrap(wrapDepth = 0)]
    Qr(<qrcodegen::DataTooLong>),
    #[giftwrap(noWrap = true)]
    Other(String),
}

现在,您可以添加一个新错误变体,该变体包装来自任何库的类型,并且 giftwrap 会为您处理其余部分

依赖项

~2MB
~45K SLoC