use super::compiler;
use crate::errors::RenderError;
use crate::graph::Graph;
use crate::mermaid::state::parse_state_diagram;
use crate::registry::{DiagramInstance, ParsedDiagram};
#[derive(Default)]
pub struct StateInstance;
impl StateInstance {
pub fn new() -> Self {
Self
}
}
impl DiagramInstance for StateInstance {
fn parse(
self: Box<Self>,
input: &str,
) -> Result<Box<dyn ParsedDiagram>, Box<dyn std::error::Error + Send + Sync>> {
let model = parse_state_diagram(input)?;
Ok(Box::new(ParsedState {
diagram: compiler::compile(&model),
}))
}
}
struct ParsedState {
diagram: Graph,
}
impl ParsedDiagram for ParsedState {
fn into_payload(self: Box<Self>) -> Result<crate::payload::Diagram, RenderError> {
Ok(crate::payload::Diagram::State(self.diagram))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn state_instance_parses_valid_input() {
let parsed = Box::new(StateInstance::new())
.parse("stateDiagram-v2\n [*] --> Idle")
.expect("state input should parse");
let payload = parsed
.into_payload()
.expect("parsed state input should build a payload");
let crate::payload::Diagram::State(graph) = payload else {
panic!("state should yield a State payload");
};
assert!(graph.nodes.contains_key("Idle"));
}
#[test]
fn state_instance_rejects_invalid_input() {
let result = Box::new(StateInstance::new()).parse("not a state diagram");
assert!(result.is_err());
}
}