#proc-macro #define #constraints #generate #boiler #debugging #plate

vts

生成用于定义具有关联约束的新类型的样板代码的宏

3个稳定版本

1.1.2 2023年2月3日
1.0.0 2023年2月1日

#611进程宏

MIT/Apache

12KB
239

VTS:验证类型

Continuous integration

这最初是一个关于实现一种新类型系统的简单想法,其中我们可以用一个底层的规范来表示一个类型。

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