simplify_baml 0.2.0

Simplified BAML runtime for structured LLM outputs using native Rust types with macros
Documentation
use simplify_baml::*;

#[test]
fn test_null_for_required_enum_field_errors() {
    let mut ir = IR::new();
    ir.enums.push(Enum {
        name: "Status".to_string(),
        values: vec!["Active".to_string(), "Inactive".to_string()],
        description: None,
    });
    ir.classes.push(Class {
        name: "User".to_string(),
        description: None,
        fields: vec![
            Field {
                name: "name".to_string(),
                field_type: FieldType::String,
                optional: false,
                description: None,
            },
            Field {
                name: "status".to_string(),
                field_type: FieldType::Enum("Status".to_string()),
                optional: false,
                description: None,
            },
        ],
    });

    let response = r#"{"name": "Alice", "status": null}"#;
    let result = parse_llm_response_with_ir(
        &ir,
        response,
        &FieldType::Class("User".to_string()),
    );

    assert!(result.is_err(), "Should error when null is provided for required enum field");
    let err = result.unwrap_err();
    let err_chain = format!("{:?}", err);
    assert!(
        err_chain.contains("null") || err_chain.contains("Null"),
        "Error should mention null: {}",
        err_chain
    );
}

#[test]
fn test_null_for_optional_enum_field_succeeds() {
    let mut ir = IR::new();
    ir.enums.push(Enum {
        name: "Status".to_string(),
        values: vec!["Active".to_string(), "Inactive".to_string()],
        description: None,
    });
    ir.classes.push(Class {
        name: "User".to_string(),
        description: None,
        fields: vec![
            Field {
                name: "name".to_string(),
                field_type: FieldType::String,
                optional: false,
                description: None,
            },
            Field {
                name: "status".to_string(),
                field_type: FieldType::Enum("Status".to_string()),
                optional: true,
                description: None,
            },
        ],
    });

    let response = r#"{"name": "Alice", "status": null}"#;
    let result = parse_llm_response_with_ir(
        &ir,
        response,
        &FieldType::Class("User".to_string()),
    );

    assert!(result.is_ok(), "Should succeed when null is provided for optional enum field");
}

#[test]
fn test_missing_required_enum_field_errors() {
    let mut ir = IR::new();
    ir.enums.push(Enum {
        name: "Status".to_string(),
        values: vec!["Active".to_string(), "Inactive".to_string()],
        description: None,
    });
    ir.classes.push(Class {
        name: "User".to_string(),
        description: None,
        fields: vec![
            Field {
                name: "name".to_string(),
                field_type: FieldType::String,
                optional: false,
                description: None,
            },
            Field {
                name: "status".to_string(),
                field_type: FieldType::Enum("Status".to_string()),
                optional: false,
                description: None,
            },
        ],
    });

    let response = r#"{"name": "Alice"}"#;
    let result = parse_llm_response_with_ir(
        &ir,
        response,
        &FieldType::Class("User".to_string()),
    );

    assert!(result.is_err(), "Should error when required enum field is missing");
}