use crate::{Engine, Format, GraphvizError};
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(js_namespace = globalThis, js_name = __graphviz_anywhere_render, catch)]
fn js_render(dot: &str, engine: &str, format: &str) -> Result<String, JsValue>;
}
fn engine_name(engine: Engine) -> &'static str {
match engine {
Engine::Dot => "dot",
Engine::Neato => "neato",
Engine::Fdp => "fdp",
Engine::Sfdp => "sfdp",
Engine::Circo => "circo",
Engine::Twopi => "twopi",
Engine::Osage => "osage",
Engine::Patchwork => "patchwork",
}
}
fn format_name(format: Format) -> &'static str {
match format {
Format::Svg => "svg",
Format::Png => "png",
Format::Pdf => "pdf",
Format::Ps => "ps",
Format::Json => "json",
Format::DotOutput => "dot",
Format::Xdot => "xdot",
Format::Plain => "plain",
}
}
pub(crate) fn render(
dot: &str,
engine: Engine,
format: Format,
) -> Result<Vec<u8>, GraphvizError> {
js_render(dot, engine_name(engine), format_name(format))
.map(|s| s.into_bytes())
.map_err(|_| GraphvizError::RenderFailed)
}