clankerdiff-ratatui 0.1.1

Embeddable Ratatui diff review widget
Documentation
use clankerdiff_core::FileDiff;
use clankerdiff_markdown::MarkdownStream;
use clankerdiff_ratatui::{
    DiffPreviewOptions, DiffPreviewState, MarkdownLayoutOptions, MarkdownRenderer,
    StreamingMarkdownState,
};
use clankerdiff_syntax::SyntaxHighlighter;
use clankerdiff_theme::ReviewTheme;
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    let theme = ReviewTheme::default();
    let mut highlighter = SyntaxHighlighter::default();
    let renderer = MarkdownRenderer::new();
    let mut stream = MarkdownStream::new();
    let mut state = StreamingMarkdownState::default();
    let mut rows = Vec::new();
    let mut revision = 0;
    for chunk in [
        "# Update\n\n",
        "Use the new value:\n\n```rust\n",
        "let value = 42;\n```\n",
    ] {
        stream.push(chunk);
        renderer.render_stream_layout(
            &mut state,
            &stream,
            MarkdownLayoutOptions::default(),
            &theme,
            &mut highlighter,
        );
        let update = state.update_since(revision);
        rows.truncate(update.first_changed_row);
        rows.extend(update.replacement.iter().cloned());
        revision = update.revision;
    }
    stream.finish();
    renderer.render_stream_layout(
        &mut state,
        &stream,
        MarkdownLayoutOptions::default(),
        &theme,
        &mut highlighter,
    );
    let update = state.update_since(revision);
    rows.truncate(update.first_changed_row);
    rows.extend(update.replacement.iter().cloned());
    for row in rows {
        println!("{}", row.line);
    }
    let mut preview = DiffPreviewState::new(FileDiff::from_texts(
        "main.rs",
        "let value = 1;\n",
        "let value = 42;\n",
    )?);
    for row in preview
        .render(80, &theme, &mut highlighter, DiffPreviewOptions::default())
        .iter()
    {
        println!("{row}");
    }
    Ok(())
}