mmdflux 2.4.0

Render Mermaid diagrams as Unicode text, ASCII, SVG, and MMDS JSON.
Documentation
use mmdflux::mmds::Document;
use mmdflux::views::{
    AnchorRef, Selector, TraversalDirection, ViewEvent, ViewSpec, ViewStatement, project,
};
use mmdflux::{OutputFormat, RenderConfig, materialize_diagram, render_document};

const SOURCE: &str = r#"graph TD
service_a[Service A] --> service_b[Service B]
external[External] --> service_a
service_b --> service_c[Service C]
service_c --> database[Database]
service_a --> audit[Audit]
"#;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let canonical: Document = materialize_diagram(SOURCE, &RenderConfig::default())?;
    let spec = ViewSpec::new(vec![ViewStatement::Include(Selector::Traversal {
        anchor: AnchorRef::Node("service_a".to_string()),
        direction: TraversalDirection::Downstream,
        hops: 2,
    })]);

    let (view, events) = project(&canonical, &spec)?;
    let text = render_document(&view, OutputFormat::Text, &RenderConfig::default())?;

    println!("retained nodes:");
    for node in &view.nodes {
        println!("- {}", node.id);
    }

    println!("\nelided edges:");
    for event in &events {
        if let ViewEvent::EdgeElided {
            source,
            target,
            ordinal,
            ..
        } = event
        {
            println!("- {source} -> {target} (ordinal {ordinal})");
        }
    }

    println!("\n{text}");
    Ok(())
}