typeshift 0.5.1

Zod-like parse, validation, and JSON Schema flow for Rust types
Documentation
use typeshift::typeshift;

#[typeshift]
struct ValidationShape {
    #[validate(length(min = 3, max = 12))]
    username: String,
    #[validate(range(min = 18, max = 120))]
    age: u32,
    #[validate(email)]
    email: String,
    #[validate(url)]
    website: String,
    #[validate(contains(pattern = "core"))]
    slug: String,
    #[validate(required)]
    backup_email: Option<String>,
}

#[test]
fn validate_attributes_are_reflected_in_schema() {
    let schema = typeshift::schema_json::<ValidationShape>();
    let props = &schema["properties"];

    assert_eq!(props["username"]["minLength"], 3);
    assert_eq!(props["username"]["maxLength"], 12);

    assert_eq!(props["age"]["minimum"].as_f64(), Some(18.0));
    assert_eq!(props["age"]["maximum"].as_f64(), Some(120.0));

    assert_eq!(props["email"]["format"], "email");
    assert_eq!(props["website"]["format"], "uri");

    assert_eq!(props["slug"]["pattern"], "core");

    let required = match schema["required"].as_array() {
        Some(required) => required,
        None => panic!("required must be an array"),
    };
    assert!(required.iter().any(|name| name == "backup_email"));
}