Skip to main content

plantuml_sequence/
plantuml_sequence.rs

1use dotparser::{EdgeType, GraphEvent, plantuml};
2
3fn main() {
4    let sequence_diagram = r#"
5@startuml
6actor User
7participant "Web Server" as Web
8database "Database" as DB
9
10User -> Web: HTTP Request
11activate Web
12Web -> DB: Query
13activate DB
14DB --> Web: Results
15deactivate DB
16Web --> User: HTTP Response
17deactivate Web
18@enduml
19"#;
20
21    match plantuml::parse(sequence_diagram) {
22        Ok(events) => {
23            println!("Parsed PlantUML sequence diagram as events:");
24
25            // Count participants and messages
26            let mut participants = Vec::new();
27            let mut messages = Vec::new();
28
29            for event in &events {
30                match event {
31                    GraphEvent::AddNode {
32                        id,
33                        label,
34                        node_type,
35                        ..
36                    } => {
37                        participants.push((id.clone(), label.clone(), node_type.clone()));
38                    }
39                    GraphEvent::AddEdge {
40                        edge_type: EdgeType::Message { .. },
41                        from,
42                        to,
43                        label,
44                        ..
45                    } => {
46                        messages.push((from.clone(), to.clone(), label.clone()));
47                    }
48                    _ => {}
49                }
50            }
51
52            println!("Participants: {}", participants.len());
53            for (id, label, node_type) in &participants {
54                println!(
55                    "  - {} ({:?}): {}",
56                    id,
57                    node_type,
58                    label.as_deref().unwrap_or("no label")
59                );
60            }
61
62            println!("\nMessages: {}", messages.len());
63            for (i, (from, to, label)) in messages.iter().enumerate() {
64                println!(
65                    "  {}. {} -> {}: {}",
66                    i + 1,
67                    from,
68                    to,
69                    label.as_deref().unwrap_or("no label")
70                );
71            }
72        }
73        Err(e) => {
74            eprintln!("Error parsing PlantUML: {e}");
75        }
76    }
77}