15 unstable releases (4 breaking)
0.5.3 | Sep 3, 2024 |
---|---|
0.5.2 | Jun 11, 2024 |
0.5.1 | May 26, 2024 |
0.3.0 | Nov 9, 2023 |
#298 in Encoding
824 downloads per month
215KB
6K
SLoC
Valitron is an ergonomic, functional and configurable validator
In the future, modularization will be supported
Inspired by axum
Features
- Ergonomics validation
- Build-in rule, e.g. Required, StartWith ...
- Closure validate
- Related validate, e.g. password confirm
- Custom rule with other parameter
- Check / modify input data
- Custom error message type
- Support different error types convert, it can use both build-in rules and custom error type simultaneously
- Collect validate error messages
- Support all types data on
#[derive(Serialize, Deserialize)]
( visitserde
for more info)
Example 1
fn main() {
let validator = Validator::new()
.rule("name", Required.and(StartWith("hello")))
.rule("age", custom(age_limit))
.message([
("name.required", "name is required"),
("name.start_with", "name should be starts with `hello`"),
]);
let person = Person {
name: "li",
age: 18,
};
let res = validator.validate(person);
// or using trait
let res = person.validate(validator);
}
fn age_limit(n: &mut u8) -> Result<(), Message> {
if *n >= 25 && *n <= 45 {
return Ok(());
}
Err("age should be between 25 and 45".into())
}
Example 2
use valitron::register::string::Validator;
impl Input {
fn new(mut input: Input) -> Result<Self, Validator<Message>> {
let valid = Validator::new()
.insert("name", &mut input.name, Trim.and(Required))
.insert("email", &mut input.email, Trim.and(Required).and(Email))
.insert("gender", &mut input.gender, custom(validate_gender))
.insert(
"password",
&mut input.password,
Trim.custom(validate_password),
)
.insert_fn("age", || {
if input.age < 10 {
input.age = 10;
}
if input.age > 18 {
Err(Message::fallback("age is out of range"))
} else {
Ok(())
}
});
valid.validate(input)
}
}
fn validate_password(pass: &mut String) -> Result<(), Message> {
todo!()
}
fn validate_gender(gender: &mut String) -> Result<(), Message> {
Ok(())
}
Rules Usage
Usage | Description |
---|---|
Required |
one rule |
Required.and(StartsWith("foo")) |
multi rules |
Required.and(StartsWith('a')).bail() |
multi rules and bail |
custom(my_handler) |
custom handler rule |
Required.custom(my_handler) |
rule and handler rule |
Not(StartsWith("foo")) |
negative rule |
Required.and(Not(StartsWith("foo"))) |
negative rule |
Bench
second scheme | validator(other library) |
---|---|
192.55 ns | 680.43 ns |
License
Licensed under either of Apache License, Version 2.0 or MIT license at your option.Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Dependencies
~0.1–1MB
~22K SLoC