3个稳定版本
1.1.2 | 2023年2月3日 |
---|---|
1.0.0 | 2023年2月1日 |
#611 在 进程宏
12KB
239 行
VTS:验证类型
这最初是一个关于实现一种新类型系统的简单想法,其中我们可以用一个底层的规范来表示一个类型。
type NewType = BaseType
where constraint;
NewType
被定义为 BaseType
的包装,其中附加了 constraint
。
例如,可以定义以下内容
vts::vts!{
/// String that have been already validated against the constraint that
/// all the characters of the string are valid hexadecimal digits
///
/// For example:
///
/// * `00`
/// * `a`
/// * `0123456789abcdef`
///
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub type HexaString = String
where self.chars().all(|c| c.is_ascii_hexdigit());
}
因此,在这里我们说 HexaString
是一个 String
,其中所有字符都符合给定的 constraint
:所有字符都是ASCII十六进制字符。
在Rust实现的上下文中,这仅仅是一种方便地包装基类型并添加一些约束到提升的方式。本质上,生成的代码将如下所示
struct HexaString(String);
struct HexaStringConstraintError;
impl HexaString {
pub fn new(value: String) -> Result<Self, HexaStringConstraintError> {
let value = Self(value);
if value.__constraint() {
Ok(value)
} else {
Err(HexaStringConstraintError)
}
}
fn __constraint(&self) -> bool {
self.chars().all(|c| c.is_ascii_hexdigit())
}
}
impl std::ops::Deref for HexaString {
type Target = String;
fn deref(&self) -> &Self::Target {
&self.0
}
}
依赖项
~1.5MB
~35K SLoC