#枚举 #pub # #变体 #人类 #eve #文档

wrapped_enum

一个有用的宏,用于将现有类型封装到枚举中(常用于快速错误处理)

2 个版本

使用旧的 Rust 2015

0.1.3 2015 年 7 月 8 日
0.1.2 2015 年 7 月 8 日
0.1.1 2015 年 7 月 8 日
0.1.0 2015 年 7 月 8 日

#8#eve


tabin-plugins 中使用

MIT 许可证

4KB
78

//! wrapped_enum! - 将多个类型封装到 Enum 中 //! //! 当需要返回多个类型时很有用。只需要处理已知类型的枚举即可。 //! //! 使用公共枚举时需要文档说明 //! //! //! # #[macro_use] extern crate wrapped_enum; //! # use std::io; //! #[derive(Debug)] //! pub enum TestError { //! ErrorA, //! ErrorB(u8, u16), //! ErrorC(String), //! } //! //! wrapped_enum!{ //! #[derive(Debug)] //! /// 对您的 pub 枚举进行文档说明 //! pub enum DocumentedEnum { //! /// 变体也太多。Io(io::Error), //! /// 对 pub 枚举的文档说明是必需的 Test(TestError), //! /// 未知错误 Unknown(()), //! } //! } //! //! wrapped_enum!{ //! #[derive(Debug, Eq, PartialEq)] //! /// 您不能对私有变体进行文档说明 //! enum UndocumentedEnum { //! // 然而,正常的注释是没有问题的!Byte(u8), // 00-FF //! DoubleByte(u16), // 0000-FFFF //! } //! } //! //! # fn main() { //! assert!(UndocumentedEnum::from(0u8) == UndocumentedEnum::Byte(0)); //! assert!(UndocumentedEnum::from(0u16) == UndocumentedEnum::DoubleByte(0)); //! # } //!

#[macro_export] macro_rules! wrapped_enum { ($(#[$attr:meta])* pub enum $enum_name:ident { $($(#[$variant_attr:meta])+ $enum_variant_name:ident($ty:ty)),+ $(,)* } ) => ( $(#[$attr])* pub enum $enum_name { $($(#[$variant_attr])+ $enum_variant_name($ty)),+ } $(impl From<$ty> for $enum_name { fn from (ty: $ty) -> Self { $enum_name::$enum_variant_name(ty) } })+ ); ($(#[$attr:meta])* enum $enum_name:ident { $($enum_variant_name:ident($ty:ty)),+ $(,)* } ) => ( $(#[$attr])* enum $enum_name { $($enum_variant_name($ty)),+ } $(impl From<$ty> for $enum_name { fn from (ty: $ty) -> Self { $enum_name::$enum_variant_name(ty) } })+ ); }

#[cfg(test)] mod test { #[derive(Debug)] #[allow(dead_code)] pub enum CommunicationError { HumanError(Human, ErrorAction), UnknownError, }

#[derive(Debug)]
#[allow(dead_code)]
pub enum ErrorAction {
    AttemptedToStealSecrets,
    StoleSecrets,
}

#[derive(Debug)]
#[allow(dead_code)]
pub enum Human {
    Alice, // Good
    Bob,   // Good
    Carol, // Good
    Dave,  // Good
    Eve,   // Bad
}

wrapped_enum!{
    #[derive(Debug)]
    /// Document your pub enums
    pub enum TestError {

// /// 变体也太多。Io(io::Error), /// 对 pub 枚举的文档说明是必需的 Test(CommunicationError), /// 未知错误 Unknown(()), } }

wrapped_enum!{
    #[derive(Debug)]
    /// You can't document private variants
    enum UndocumentedEnum {
        // However, there is nothing wrong with normal comments
        Byte(u8),        // 00-FF
        DoubleByte(u16), // 0000-FFFF
    }
}

#[test]
fn eve_intercept_alice_and_bobs_communication() {
    let error: Result<(), CommunicationError> =
        Err(CommunicationError::HumanError(Human::Eve,
                                           ErrorAction::AttemptedToStealSecrets));

    let result: Result<(), TestError> = error.map_err(From::from);

    assert!(result.is_err());
}

}

无运行时依赖