mdstream 0.2.0

Streaming-first Markdown middleware for LLM output (committed + pending blocks, render-agnostic).
Documentation
mod support;

use mdstream::{BlockKind, Options};

#[test]
fn code_fence_opening_line_does_not_close_itself() {
    let markdown = "```\ncode\n```\n";
    let blocks = support::collect_final_blocks(support::chunk_whole(markdown), Options::default());
    assert_eq!(blocks.len(), 1, "expected 1 block, got {blocks:?}");
    assert_eq!(blocks[0].0, BlockKind::CodeFence);
    assert_eq!(blocks[0].1, markdown);
}

#[test]
fn code_fence_chunking_invariance_no_language() {
    let markdown = "```\ncode\n```\n";
    let opts = Options::default();
    let whole = support::collect_final_blocks(support::chunk_whole(markdown), opts.clone());
    let lines = support::collect_final_blocks(support::chunk_lines(markdown), opts.clone());
    let chars = support::collect_final_blocks(support::chunk_chars(markdown), opts);
    assert_eq!(lines, whole);
    assert_eq!(chars, whole);
}

#[test]
fn code_fence_with_inner_backticks_is_single_block() {
    let markdown = "````\nState: Normal\n  → see ``` → State: Fence\n````\n";
    let blocks = support::collect_final_blocks(support::chunk_whole(markdown), Options::default());
    assert_eq!(blocks.len(), 1, "expected 1 block, got {blocks:?}");
    assert_eq!(blocks[0].0, BlockKind::CodeFence);
    assert_eq!(blocks[0].1, markdown);
}