typeshift 0.5.1

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

#[typeshift]
#[derive(Debug)]
struct User {
    #[validate(length(min = 3))]
    name: String,
}

#[typeshift]
#[derive(Debug)]
struct Envelope<T> {
    payload: T,
}

#[typeshift]
#[derive(Debug)]
#[serde(tag = "kind", content = "data")]
enum Event<T> {
    #[serde(rename = "user.created")]
    UserCreated { user: T },
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let input = r#"{"kind":"user.created","data":{"user":{"payload":{"name":"Ada"}}}}"#;

    let event: Event<Envelope<User>> = typeshift::parse_str(input)?;
    let json = typeshift::to_json(&event)?;
    let schema = typeshift::schema_json::<Event<Envelope<User>>>();

    println!("parsed: {event:?}");
    println!("json: {json}");
    println!("schema has oneOf: {}", schema["oneOf"].is_array());

    Ok(())
}