1个不稳定版本
0.1.0 | 2022年7月21日 |
---|
#2549 在 Rust模式
11KB
121 行
Vet
任意类型验证。
用法
在 Cargo.toml
中添加依赖项条目。
[dependencies]
vet = "0.1"
在您的类型上实现 Vet
特性。
use vet::{Valid, Vet};
// A valid username consists of between 3 and 32 alphanumeric characters
#[derive(Debug)]
struct Username(String);
#[derive(Debug, PartialEq)]
enum InvalidUsername {
TooShort, // Under 3 characters
TooLong, // Over 3 characters
InvalidChar, // Contains non-alphanumeric character
}
impl Vet for Username {
type Error = InvalidUsername;
// Arbitrary logic to validate the Username type
fn is_valid(&self) -> Result<(), Self::Error> {
if self.0.len() < 3 {
return Err(Self::Error::TooShort);
}
if self.0.len() > 32 {
return Err(Self::Error::TooLong);
}
if self.0.chars().any(|c| !c.is_alphanumeric()) {
return Err(Self::Error::InvalidChar);
}
Ok(())
}
}
Valid
包装的类型为其内容提供安全保证。
fn main() {
let args: Vec<String> = env::args().collect();
let username: Username = Username(args[1].clone());
let username: Result<Valid<Username>, InvalidUsername> = username.vet();
match username {
Ok(n) => create_account(n),
Err(e) => eprintln!("Invalid username: {:?}", e),
}
}
// Any `Valid<Username>` passed is guaranteed to be 3-32 alphanumeric characters.
fn create_account(username: Valid<Username>) {
let username = username.into_inner(); // Unwrap
println!("Account {:?} created", username);
}
内置实现
为泛型数组 [T: Vet; N]
和标准库类型 Vec<T: Vet>
和 Option<T: Vet>
提供了实现。
数组和 Vec
仅在其所有单个元素都有效时才有效
let usernames = vec![
Username("日向".to_string()),
Username("seán462".to_string()),
Username("lone wolf".to_string())
].vet();
// Invalid, whitespace in the third element
let contact_numbers = [
PhoneNumber("427-313-0255"),
PhoneNumber("+1 (708) 484-0523")
].vet();
// Valid, all elements passed vetting
包含 None
的选项始终有效
let mut email: Option<EmailAddress> = None;
email.vet(); // Valid
let mut email: Option<EmailAddress> = Some("benjamin@@metanomial.com");
email.vet(); // Invalid, regex test failed
无std支持
可以通过禁用默认的 std
功能标志来在 no_std 环境中使用此库。修改您的依赖项条目在 Cargo.toml
中如下
[dependencies]
vet = { version = "0.1", default-features = false }
在具有内存分配器的 no_std 环境中,可以使用 alloc
功能标志重新启用 Vec
的实现
[dependencies]
vet = { version = "0.1", default-features = false, features = ["alloc"] }
许可协议
根据您的选择,许可协议如下
- Apache许可证版本 2.0 (license-apache.txt 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (license-mit.txt 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确表示,否则任何有意提交以包含在您的工作中的贡献,根据 Apache-2.0 许可证定义,应双许可如上所述,没有任何额外的条款或条件。