Explicit Schema Builder

This walkthrough demonstrates how to build and validate structured configurations programmatically at runtime using the Schema object builder API without depending on macro derivation.

Compilable Example

//! explicit_schema example — demonstrates ObjectSchema builder without derive macro.

use adapters::json::parse;
use adapters::{Schema, SchemaValidator, Value};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("=== explicit_schema example ===\n");

    // Build a schema for a user object without any derive macros
    let user_schema = Schema::object()
        .field(
            "username",
            Schema::string().required().min_length(3).max_length(32),
        )
        .field("email", Schema::string().required().email())
        .field("age", Schema::integer().required().min(18).max(120))
        .field("bio", Schema::string().optional());

    // Validate a valid JSON value
    let json = r#"{"username":"bob","email":"bob@example.com","age":30}"#;
    let value = parse(json)?;
    match user_schema.validate(&value, "root") {
        Ok(()) => println!("Valid user object!"),
        Err(e) => println!("Validation error: {}", e),
    }

    // Validate an invalid value
    let bad_json = r#"{"username":"x","email":"notanemail","age":15}"#;
    let bad_value = parse(bad_json)?;
    match user_schema.validate(&bad_value, "root") {
        Ok(()) => println!("Valid (unexpected)"),
        Err(e) => println!("Error (expected): {}", e),
    }

    // Build a standalone string schema
    let email_schema = Schema::string().required().email().min_length(5);
    let email_val = Value::String("test@example.com".into());
    let bad_email = Value::String("notvalid".into());

    println!(
        "\nEmail '{}': {:?}",
        email_val.as_str().unwrap(),
        Schema::String(email_schema)
            .validate(&email_val, "email")
            .map(|_| "valid")
    );
    let email_schema2 = Schema::string().required().email().min_length(5);
    println!(
        "Email 'notvalid': {:?}",
        Schema::String(email_schema2)
            .validate(&bad_email, "email")
            .err()
            .map(|e| e.to_string())
    );

    Ok(())
}