facet-validate

Crates.iofacet-validate
lib.rsfacet-validate
version0.43.2
created_at2026-01-06 13:16:13.942164+00
updated_at2026-01-23 18:02:12.72157+00
descriptionValidation attributes for facet - validate field values during deserialization
homepagehttps://facet.rs
repositoryhttps://github.com/facet-rs/facet
max_upload_size
id2025849
size28,655
Amos Wenger (fasterthanlime)

documentation

README

facet-validate

Coverage Status crates.io documentation MIT/Apache-2.0 licensed Discord

facet-validate

Field validation during deserialization for the facet ecosystem.

Features

  • 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 for String fields

Usage

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,
}

Built-in Validators

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

Integration

Enable the validate feature on facet-json (or other format crates):

[dependencies]
facet-json = { version = "0.41", features = ["validate"] }
facet-validate = "0.41"

Sponsors

Thanks to all individual sponsors:

GitHub Sponsors Patreon

...along with corporate sponsors:

AWS Zed Depot

...without whom this work could not exist.

Special thanks

The facet logo was drawn by Misiasart.

License

Licensed under either of:

at your option.

Commit count: 3380

cargo fmt