#string #macro #type #associated #declaring #value #ord

newstr

用于声明基于String的新类型的简单宏

4个版本

0.2.0 2022年10月10日
0.1.2 2021年5月14日
0.1.1 2021年4月16日
0.1.0 2021年4月16日

#782 in Rust模式

MIT许可证

18KB
148

包newstr

用于声明基于String的新类型的简单宏。

MIT License Minimum Rust Version crates.io docs.rs Build Audit GitHub stars

该包提供简单的宏,用于生成基于String的新类型。这两个主要的宏通过以下方式实现新类型的有效性规则:1) 提供一个用于is_valid关联函数的谓词,或者2) 提供一个解析并返回字符串的函数,然后由FromStr::from_str调用。

这两种方法都产生一个新类型,具有以下特点

  1. 一个关联谓词函数is_valid,如果提供的字符串对于该类型是有效的,则返回true
  2. 该类型派生了以下实现:CloneDebugPartialEqPartialOrdEqOrdHash
  3. T实现Display,它简单地返回内部值。
  4. String实现From<T>
  5. T实现AsRef,目标类型为str
  6. T实现Deref,目标类型为str
  7. 实现FromStr

还可以将用户所需的其他特性添加到宏中,以便由实现派生。

示例

以下示例构建了一个新字符串类型,该类型实现了Identifier值。该值必须是ASCII、字母数字、'_'字符,并且不能为空。

use std::fmt::{Display, Formatter};
use std::str::FromStr;

fn is_identifier_value(s: &str) -> bool {
    !s.is_empty() && s.chars().all(|c| c.is_ascii_alphanumeric() || c == '_')
}

is_valid_newstring!(Identifier, is_identifier_value);

assert!(!Identifier::is_valid(""));
assert!(!Identifier::is_valid("hi!"));
assert!(!Identifier::is_valid("hello world"));
assert!(!Identifier::is_valid("9.99"));

assert_eq!(
    Identifier::from_str("hi").unwrap().to_string(),
    String::from("hi")
);
assert_eq!(
    Identifier::from_str("hello_world").unwrap().to_string(),
    String::from("hello_world")
);

new_unchecked将为类型添加一个构造函数,允许受信任的客户绕过有效性检查。

new_unchecked!(pub(crate) Identifier);

assert_eq!(
    Identifier::from_str("hi").unwrap(),
    Identifier::new_unchecked("hi")
);

依赖关系

在上面的例子中,您可以看到由宏生成的特实现所需的use声明。除非您使用regex_is_valid,否则没有crate依赖;如果您使用,则需要添加lazy_staticregex依赖。

变更

版本 0.2.0

  • 对宏API的变更:
    • 使用;而不是,来分隔额外的derive宏,
    • 在所有宏中使用完整路径,不再需要use_required宏,
    • 客户端需要导入它们随后使用的任何特质,如FromStr
  • 添加了new_unchecked宏以绕过有效性检查。

版本 0.1.2

  • 为两个宏都添加了额外的、可选的参数,允许将额外的特质添加到生成的结构体的derive属性上。
  • 重构了宏以减少重复。
  • 添加了一些额外的测试。

版本 0.1.1

  • 添加了新的use_required宏。
  • 删除了不必要的功能'regex_is_valid',构建不需要此功能以避免膨胀。
  • lazy_staticregex设为开发依赖,如果您不使用它们,则不需要它们。
  • 添加了对cargo-husky的依赖以保持Git清洁。

版本 0.1.0

  • 初始版本。

无运行时依赖