Skip to main content

libpetri_export/
dot_exporter.rs

1use libpetri_core::petri_net::PetriNet;
2
3use crate::dot_renderer::render_dot;
4use crate::mapper::{DotConfig, map_to_graph};
5
6/// Convenience function: maps a PetriNet to DOT format string.
7pub fn dot_export(net: &PetriNet, config: Option<&DotConfig>) -> String {
8    let default_config = DotConfig::default();
9    let config = config.unwrap_or(&default_config);
10    let graph = map_to_graph(net, config);
11    render_dot(&graph)
12}
13
14#[cfg(test)]
15mod tests {
16    use super::*;
17    use libpetri_core::input::one;
18    use libpetri_core::output::out_place;
19    use libpetri_core::place::Place;
20    use libpetri_core::transition::Transition;
21
22    #[test]
23    fn dot_export_simple() {
24        let p1 = Place::<i32>::new("p1");
25        let p2 = Place::<i32>::new("p2");
26        let t = Transition::builder("t1")
27            .input(one(&p1))
28            .output(out_place(&p2))
29            .build();
30        let net = PetriNet::builder("test").transition(t).build();
31
32        let dot = dot_export(&net, None);
33        assert!(dot.contains("digraph test"));
34        assert!(dot.contains("p_p1"));
35        assert!(dot.contains("p_p2"));
36        assert!(dot.contains("t_t1"));
37    }
38}