#string #enums #flags #set #debugging

strflags

支持固定变体的字符串枚举和字符串标志,也可接受任意数据

6个版本

0.3.1 2023年9月26日
0.3.0 2023年9月26日
0.2.2 2023年9月24日
0.1.1 2023年9月19日

#45 in #enum

MIT/Apache

29KB
611 行代码(不包括注释)

strflags

支持固定变体的字符串枚举和字符串标志,也可接受任意数据。

这比传统的枚举、位标志或枚举集更易于扩展,同时比字符串集(如 HashSet<String>)更方便使用和不易出错。

示例

str_flags! {
    #[derive(PartialOrd)]
    pub Color: [
        Red,
        Green,
        DarkBlue,
    ]
}

这将生成

pub struct Color(..)

和常量

  • pub constRed:Color= "red";
  • pub constGreen:Color= "green";
  • pub constDarkBlue:Color= "darkblue";

并自动实现

  • DebugCloneEqHash
  • 显示
  • FromStr
  • Borrow<str>
  • AsRef<str>
  • PartialEq<implAsRef<str>>
  • Into<Flags<Self>>
  • BitOr<Output = Flags<Self>>
  • Serialize,启用serde功能
  • Deserialize,启用serde功能

Flags

您可以使用以下方式创建一个Flags<Color>

str_enum!()

使用str_enum!()宏来禁用与标志相关的功能。

let flags = Color::Red | Color::Green | Color::new("Yellow");

格式

我们以flatlowercase形式存储所有数据,以避免大小写不匹配和一些拼写错误。

序列化和反序列化

我们使用字符串来序列化我们的“字符串枚举”。

例如:"red"

我们使用类似CSV的字符串来序列化我们的Flags

例如:"dog|cat|giraffe"

这确保了从枚举到Flags的转换不会破坏序列化格式。

debug功能

允许任何字符串成为枚举变体显然容易出错。当启用debug功能时,每次比较都会执行模糊字符串检查,并在发现类似字符串时通过log包发出warn!警告。这显然很慢,因此在使用此功能时要小心。

警告

目前我们使用 EcoString,它只能内联 15 个字节的字符串。如果常量被 使用,则较大的编译时常量字符串会导致 运行时错误

未来的进程宏实现将解决此问题。

依赖关系

~1–1.4MB
~24K SLoC