Field validation during deserialization for the facet ecosystem.
- Validation runs during deserialization, so errors include source spans (e.g., pointing to the exact JSON location)
- Custom validators with meaningful error messages via
Result<(), String> - Auto-deref:
fn(&str)validators work forStringfields
use facet::Facet;
use facet_validate as validate;
fn validate_positive(n: &i64) -> Result<(), String> {
if *n <= 0 {
Err(format!("must be positive, got {}", n))
} else {
Ok(())
}
}
#[derive(Facet)]
struct Product {
#[facet(validate::custom = validate_positive)]
price: i64,
}| Validator | Syntax | Applies To |
|---|---|---|
min |
validate::min = 0 |
numbers |
max |
validate::max = 100 |
numbers |
min_length |
validate::min_length = 1 |
String, Vec, slices |
max_length |
validate::max_length = 100 |
String, Vec, slices |
email |
validate::email |
String |
url |
validate::url |
String |
regex |
validate::regex = r"..." |
String |
contains |
validate::contains = "foo" |
String |
custom |
validate::custom = fn_name |
any |
Enable the validate feature on facet-json (or other format crates):
[dependencies]
facet-json = { version = "0.41", features = ["validate"] }
facet-validate = "0.41"Thanks to all individual sponsors:
...along with corporate sponsors:
...without whom this work could not exist.
The facet logo was drawn by Misiasart.
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.