use supramark_diagram_core::{DiagramEngine, DiagramError, RenderOutput};
use crate::{Engine, Format, GraphvizContext};
#[derive(Debug, Default, Clone, Copy)]
pub struct GraphvizEngine;
impl DiagramEngine for GraphvizEngine {
fn id(&self) -> &'static str {
"graphviz"
}
fn render(&self, source: &str) -> Result<RenderOutput, DiagramError> {
let ctx = GraphvizContext::new().map_err(|e| DiagramError::Render {
engine: "graphviz",
message: format!("create context failed: {e}"),
})?;
let bytes = ctx
.render(source, Engine::Dot, Format::Svg)
.map_err(|e| DiagramError::Render {
engine: "graphviz",
message: e.to_string(),
})?;
Ok(RenderOutput::svg(bytes))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn render_minimal_dot_yields_nonempty_svg() {
let engine = GraphvizEngine;
assert_eq!(engine.id(), "graphviz");
let out = engine
.render("digraph{a->b}")
.expect("render minimal dot should succeed");
assert_eq!(out.mime, "image/svg+xml");
assert!(!out.bytes.is_empty(), "rendered SVG bytes should be non-empty");
}
#[test]
fn semantic_defaults_to_none() {
let engine = GraphvizEngine;
assert!(engine
.semantic("digraph{a->b}")
.expect("default semantic must not error")
.is_none());
}
}