2 个不稳定版本
0.2.0 | 2023 年 8 月 15 日 |
---|---|
0.1.0 | 2023 年 8 月 5 日 |
#19 in #类型
用于 pican
12KB
152 行
TypeSum
用于处理枚举的工具,主要针对求和类型。
包含内容
#[sumtype]
: 为求和类型生成所有需要的函数和实现
如果需要完整列表,请参阅 属性的文档
use typesum::{sumtype, TryIntoError};
#[sumtype]
#[derive(Debug, PartialEq, Eq)]
enum MyT {
Int(i64),
Bool(bool),
}
let mut v = MyT::Int(6);
assert!(v.is_int());
assert_eq!(v.as_int(), Some(&6));
assert_eq!(v.as_int_mut(), Some(&mut 6));
assert_eq!(v.try_as_int(), Ok(&6));
assert_eq!(v.try_as_int_mut(), Ok(&mut 6));
assert_eq!(v.try_as_bool(), Err(TryIntoError::new("MyT", "Int", "Bool")));
assert_eq!(MyT::from(false), MyT::Bool(false));
assert_eq!(MyT::from(false).try_into_int(), Err(TryIntoError::new("MyT", "Bool", "Int")));
可以使用 #[sumtype(ignore)]
忽略单个变体
use typesum::sumtype;
#[sumtype]
enum MyT {
Int(i64),
#[sumtype(ignore)]
Empty,
}
let v = MyT::Empty;
v.as_empty(); // doesn't exist
它可以与重叠类型一起工作
use typesum::sumtype;
#[sumtype(from = false, impl_try_into)]
#[derive(Debug, PartialEq, Eq)]
enum Overlap {
#[sumtype(from)]
Int1(i64),
Int2(i64),
Int3(i64),
#[sumtype(from)]
Bool1(bool),
Bool2(bool),
}
assert_eq!(Overlap::from(0), Overlap::Int1(0));
assert_eq!(Overlap::Int3(5).try_into(), Ok(5));
assert_eq!(Overlap::from(false), Overlap::Bool1(false));
assert_eq!(Overlap::Bool2(false).try_into(), Ok(false));
#[kinded]
: 为枚举生成类型别名
use typesum::kinded;
#[kinded]
enum LookAtMe {
Hello { world: String },
ImAUnit,
OrPerhapsATuple(i64, u32),
}
let look = LookAtMe::ImAUnit;
assert_eq!(look.kind(), LookAtMeKind::ImAUnit);
依赖项
~0.5–1MB
~21K SLoC