4个版本 (2个破坏性更新)

0.3.1 2024年4月16日
0.3.0 2021年8月19日
0.2.0 2021年7月17日
0.1.0 2020年11月24日

#178过程宏

Download history 169/week @ 2024-04-26 149/week @ 2024-05-03 98/week @ 2024-05-10 239/week @ 2024-05-17 438/week @ 2024-05-24 334/week @ 2024-05-31 563/week @ 2024-06-07 304/week @ 2024-06-14 207/week @ 2024-06-21 163/week @ 2024-06-28 171/week @ 2024-07-05 169/week @ 2024-07-12 200/week @ 2024-07-19 126/week @ 2024-07-26 141/week @ 2024-08-02 434/week @ 2024-08-09

每月973次下载
用于 6 个crate(直接使用3个)

BSD-3-Clause

31KB
448

enumber

BSD 3 Clause Main build status Latest docs Crates.IO

enumber 是一个过程宏crate,可以帮助你处理目的是表示数字的枚举(例如在解析复杂的二进制日志时)或奇特的线协议。

#[enumber::convert]
pub enum Flags {
    EnableCompression = 1,
    EnableTLS = 2,
    Other(usize),
}

lib.rs:

数值枚举

enumber crate 提供了一种机制,为你的枚举集提供大量有用的助手。其主要目的是为你自动提供一些有用的特质的便利实现。

有关详细信息,请参阅 [convert][macro@convert] 宏和 [into][macro@into] 宏,以下是一个基本示例

#[enumber::convert]
#[repr(usize)]
enum Simple {
    Foo = 1,
    Bar = 2,
}

use std::convert::TryFrom;

// You can use try_from() to go from a suitable number to an instance of
// your enumeration.
assert!(matches!(Simple::try_from(1), Ok(Simple::Foo)));

// You can convert from instances of your enumeration to a number.
assert_eq!(2 as usize, Simple::Bar.into());

// You can render instances of your enumeration to strings.
assert_eq!(&format!("{}", Simple::Foo), "Foo");

// And you can convert from a string to your enumeration, using the names
// of the enumeration items (case insensitively) or by number.  If the
// name or number is invalid, you'll get an error.

use std::str::FromStr;
assert!(matches!(Simple::from_str("Foo"), Ok(Simple::Foo)));
assert!(matches!(Simple::from_str("bAr"), Ok(Simple::Bar)));
assert!(matches!(Simple::from_str("1"), Ok(Simple::Foo)));
assert!(matches!(Simple::from_str("0x02"), Ok(Simple::Bar)));
assert!(matches!(Simple::from_str("3"), Err(ParseSimpleError::UnknownValue(_))));
assert!(matches!(Simple::from_str("wibble"), Err(ParseSimpleError::UnknownName(_))));

into 宏只实现了 From。但是,与 convert 宏不同,它可以将带数据的变体转换为值。(因为它缺少数据,所以不能将值转换为变体。)这在将丰富的错误类型转换为简单的错误代码在FFI边界处非常有用。

#[enumber::into]
#[repr(usize)]
enum Errors {
    Success = 0,
    #[value(0x10)] NotDefined(String),
    InvalidArg(String, String) = 0x20,
    OpNotSupported = 0x30,
}

// You can convert from instances of your enumeration to a number.
assert_eq!(0 as usize, Errors::Success.into());
assert_eq!(0x10 as usize, Errors::NotDefined("a".into()).into());
assert_eq!(0x10 as usize, Errors::NotDefined("123".into()).into());
assert_eq!(0x20 as usize, Errors::InvalidArg("a".into(), "123".into()).into());
assert_eq!(0x30 as usize, Errors::OpNotSupported.into());

依赖项

~240–680KB
~16K SLoC