haematite-cli 0.21.8

The haematite command: serve a store, its door and Studio, answer MCP, query with jq, and host the store's assistant seat
Documentation
use std::num::NonZeroUsize;

use serde::Serialize;

use super::WireBudget;

#[derive(Serialize)]
struct Row<'a> {
    value: &'a str,
}

#[test]
fn cumulative_wire_budget_stops_before_the_next_row() -> Result<(), Box<dyn std::error::Error>> {
    let first = Row { value: "first" };
    let second = Row { value: "second" };
    let first_bytes = serde_json::to_vec(&first)?.len();
    let mut budget = WireBudget::new(NonZeroUsize::new(first_bytes + 1).ok_or("zero budget")?);

    assert!(budget.admit(&first)?);
    assert!(!budget.admit(&second)?);
    Ok(())
}

#[test]
fn first_row_over_budget_is_an_explicit_refusal() -> Result<(), Box<dyn std::error::Error>> {
    let mut budget = WireBudget::new(NonZeroUsize::MIN);
    let Err(error) = budget.admit(&Row { value: "too large" }) else {
        return Err("oversized first row was accepted".into());
    };

    assert_eq!(error.code, "response_limit");
    Ok(())
}