xberg 1.0.8

High-performance document intelligence library for Rust. Extract text, metadata, and structured data from PDFs, Office documents, images, and 101 formats and 306 programming languages via tree-sitter code intelligence with async/sync APIs.
Documentation
#![cfg(feature = "mcp")]

use rmcp::schemars::schema_for;
use xberg::mcp::ExtractBatchParams;

#[test]
fn test_inputs_items_is_object_not_boolean() {
    let schema = schema_for!(ExtractBatchParams);
    let schema_value = serde_json::to_value(&schema).unwrap();

    let items = &schema_value["properties"]["inputs"]["items"];
    assert!(
        items.is_object(),
        "inputs items must be an object, got: {items} — \
         Moonshot AI rejects boolean `items: true` (issue #877)"
    );
}

#[test]
fn test_inputs_items_describes_the_input_envelope() {
    let schema = schema_for!(ExtractBatchParams);
    let schema_value = serde_json::to_value(&schema).unwrap();

    let item_props = &schema_value["properties"]["inputs"]["items"]["properties"];
    assert!(
        item_props["kind"].is_object(),
        "inputs items must document the `kind` discriminator, got: {item_props}"
    );
}

#[test]
fn test_inputs_is_required() {
    let schema = schema_for!(ExtractBatchParams);
    let schema_value = serde_json::to_value(&schema).unwrap();

    let is_required = schema_value["required"]
        .as_array()
        .map(|r| r.iter().any(|f| f.as_str() == Some("inputs")))
        .unwrap_or(false);

    assert!(is_required, "inputs must be a required field on ExtractBatchParams");
}