#枚举 #

define_into_enum

在所有变体都包装 T 的枚举上定义 Into<T>

1 个不稳定版本

0.1.1 2023 年 1 月 8 日
0.1.0 2023 年 1 月 8 日

#2181 in Rust 模式

Apache-2.0

6KB
87

define_into_enum! v0.1.1

这定义了一个宏 define_into_enum!,它旨在编译为例如。

use define_into_enum::define_into_enum;
define_into_enum! {
  #[derive(Debug, PartialEq)]
  pub enum TestEnum {
    Variant1((usize, usize)),
    Variant2((usize, usize)),
    Variant3((usize, usize)),
  }
  (v1, v2),
  (v1, v2)
}

然后它将 impl Into<(usize, usize)> for TestEnum,将所有 (v1, v2) 转换为 (v1, v2)

也支持元标签

define_into_enum! {
  #[non_exhaustive]
  #[derive(enum_kinds::EnumKind)]
  #[enum_kind(WordKind, derive(IsVariant, Unwrap))]
  #[derive(Clone, Debug, PartialEq, Eq, IsVariant, Unwrap)]
  pub enum Word<'a> {
    SimpleWord(Cow<'a, str>),
    SingleQuotedWord(Cow<'a, str>),
    DoubleQuotedWord(Cow<'a, str>),
    DollarSingleQuotedWord(Cow<'a, str>),
    DollarDoubleQuotedWord(Cow<'a, str>),
    UnquotedWord(Cow<'a, str>),
    ErrorWord(Cow<'a, str>),
  }
  ( s1 ),
  ( s1 )
}

该宏

macro_rules! define_into_enum {
  {
    $(#[$attr:meta])*
    $vis:vis enum $name:ident $(< $generic:lifetime >)* {
      $(#[$variant_attr1:meta])*
      $variant1:ident ($type1:ty),
      $(
        $(#[$variant_attr:meta])*
        $variant:ident ($type:ty),
      )*
    }
    $into:pat,
    $output:expr
  } => {
    $(#[$attr])*
    $vis enum $name $(<$generic>)* {
      $(#[$variant_attr1])*
      $variant1($type1),
      $(
        $(#[$variant_attr])*
        $variant($type),
      )*
    }

    impl$(<$generic>)* Into <$type1> for $name $(<$generic>)* {
      fn into(self) -> $type1 {
        match self {
          $(
            Self::$variant( $into ) => ( $output ),
          )+
          Self::$variant1( $into ) => ( $output ),
        }
      }
    }
  }
}

许可协议

版权所有 2023 Fredrick R. Brennan

在 Apache 许可证版本 2.0(“许可证”)下发行;除非适用法律要求或经书面同意,否则不得使用此文件,除非符合许可证。您可以在以下位置获得许可证副本:

http://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或经书面同意,否则在许可证下分发的软件按“原样”基础分发,不提供任何明示或暗示的保证或条件。有关许可证的具体语言、权限和限制,请参阅许可证。

无运行时依赖