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模式
18KB
148 行
包newstr
用于声明基于String的新类型的简单宏。
该包提供简单的宏,用于生成基于String的新类型。这两个主要的宏通过以下方式实现新类型的有效性规则:1) 提供一个用于is_valid
关联函数的谓词,或者2) 提供一个解析并返回字符串的函数,然后由FromStr::from_str
调用。
这两种方法都产生一个新类型,具有以下特点
- 一个关联谓词函数
is_valid
,如果提供的字符串对于该类型是有效的,则返回true
。 - 该类型派生了以下实现:
Clone
、Debug
、PartialEq
、PartialOrd
、Eq
、Ord
和Hash
。 - 为
T
实现Display
,它简单地返回内部值。 - 为
String
实现From<T>
。 - 为
T
实现AsRef
,目标类型为str
。 - 为
T
实现Deref
,目标类型为str
。 - 实现
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_static
和regex
依赖。
变更
版本 0.2.0
- 对宏API的变更:
- 使用
;
而不是,
来分隔额外的derive宏, - 在所有宏中使用完整路径,不再需要
use_required
宏, - 客户端需要导入它们随后使用的任何特质,如
FromStr
。
- 使用
- 添加了
new_unchecked
宏以绕过有效性检查。
版本 0.1.2
- 为两个宏都添加了额外的、可选的参数,允许将额外的特质添加到生成的结构体的
derive
属性上。 - 重构了宏以减少重复。
- 添加了一些额外的测试。
版本 0.1.1
- 添加了新的
use_required
宏。 - 删除了不必要的功能'regex_is_valid',构建不需要此功能以避免膨胀。
- 将
lazy_static
和regex
设为开发依赖,如果您不使用它们,则不需要它们。 - 添加了对
cargo-husky
的依赖以保持Git清洁。
版本 0.1.0
- 初始版本。