plantuml_sequence/
plantuml_sequence.rs1use 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 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}