2 个版本

0.1.2 2021 年 10 月 7 日
0.1.1 2021 年 10 月 1 日
0.1.0 2021 年 10 月 1 日

#22#u8

BSD-3-Clause

6KB

zhi_enum

轻松创建具有未知字段支持的类型转换特性。

用法

  1. EnumConvertEnumTryConvert 添加到 derive 属性中。
use zhi_enum::{EnumConvert, EnumTryConvert};

#[derive(Debug, Ord, PartialOrd, Eq, PartialEq, EnumConvert)]
#[repr(u8)]
enum NumberConvert {
    Zero,
    One,
    Two,
    Three,
    Four,
    Ten = 10,
    Eleven,
    Twenty = 10 + 10,
    TwentyOne,
    #[zhi_enum(unknown)]
    Unknown(u8),
}

#[derive(Debug, Ord, PartialOrd, Eq, PartialEq, EnumTryConvert)]
#[repr(u8)]
enum NumberTryConvert {
    Zero,
    One,
    Two,
    Three,
    Four,
    Ten = 10,
    Eleven,
    Twenty = 10 + 10,
    TwentyOne,
    #[zhi_enum(unknown)]
    Unknown(u8),
}

  1. 然后,您可以使用 .from/.into 转换函数
assert_eq!(NumberConvert::Three.into_u8(), 3u8);
assert_eq!(NumberTryConvert::Three.try_into_u8().unwrap(), 3u8);
assert_eq!(NumberConvert::Ten.into_u8(), 10u8);
assert_eq!(NumberTryConvert::Ten.try_into_u8().unwrap(), 10u8);
assert_eq!(NumberConvert::Eleven.into_u8(), 11u8);
assert_eq!(NumberTryConvert::Eleven.try_into_u8().unwrap(), 11u8);
assert_eq!(NumberConvert::TwentyOne.into_u8(), 21u8);
assert_eq!(NumberTryConvert::TwentyOne.try_into_u8().unwrap(), 21u8);

assert_eq!(NumberConvert::from(3u8), NumberConvert::Three);

use std::convert::TryFrom;
assert_eq!(NumberTryConvert::try_from(21u8).unwrap(), NumberTryConvert::TwentyOne);

处理未知区分符

  • 如果您在枚举中定义了一个具有 #[zhi_enum(unknown)] 属性的变体,如下所示

    #[zhi_enum(unknown)]
    Whatever(repr type),
    

    repr type 是您定义的表示类型,使用 #[repr(...)]

    然后,当您将 repr 类型转换为枚举类型时,未知区分符将转换为具有未知值的此变体。

  • 如果没有定义,则 .try_into() 将返回 Err(UnknownVariantError{}),并且 .into() 将调用 panic!

常见问题解答

  • 错误 E0658

    如果您遇到此错误

    error[E0658]: custom discriminant values are not allowed in enums with tuple or struct variants
      --> <source>:2:9
    

    这意味着您的 rustc 版本低于 1.56

    您可以升级 rustc。或者,如果您不想升级,您必须将 #![feature(arbitrary_enum_discriminant)] 添加到项目中。

许可证

BSD-3-Clause

依赖关系

~1.5MB
~37K SLoC