rydantic 0.6.0

Type-driven validation, JSON Schema, Cap'n Proto, Axum and SQLx models for Rust
Documentation
use rydantic::{Model, ValidationError};

async fn available(name: &str) -> Result<(), ValidationError> {
    tokio::task::yield_now().await;
    if name == "taken" {
        Err(ValidationError::new("taken", "name is already registered"))
    } else {
        Ok(())
    }
}
#[derive(Debug, Model)]
struct Account {
    #[model(trim, min_length = 2, async_validate = available)]
    name: String,
}
#[tokio::main]
async fn main() -> Result<(), rydantic::ValidationErrors> {
    let account = Account::parse_validated_json_async(r#"{"name":" Alice "}"#).await?;
    println!(
        "{}",
        serde_json::to_string(&account).expect("validated account")
    );
    let errors = Account::parse_json_async(r#"{"name":"taken"}"#)
        .await
        .unwrap_err();
    assert_eq!(errors.errors()[0].code, "taken");
    println!("{}", errors.to_json());
    Ok(())
}