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
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";
并自动实现
Debug
、Clone
、Eq
、Hash
显示
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