From 4f6fa6feff7cef226e71935ffa596f4f7039ab31 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Tue, 16 Jun 2026 16:50:17 +0200 Subject: [PATCH] fix: move class members outside mermaid namespace blocks (parse error fix) --- .../adapters/mermaid/src/mermaid_renderer.rs | 32 +++++++++++++++---- docs/architecture/module.mmd | 8 ++--- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/crates/adapters/mermaid/src/mermaid_renderer.rs b/crates/adapters/mermaid/src/mermaid_renderer.rs index 8c6d96b..8b4e385 100644 --- a/crates/adapters/mermaid/src/mermaid_renderer.rs +++ b/crates/adapters/mermaid/src/mermaid_renderer.rs @@ -50,9 +50,11 @@ impl MermaidRenderer { let has_namespaces = !grouped.is_empty(); let mut seen: HashSet = HashSet::new(); + let mut deferred_members: Vec = Vec::new(); + for element in &ungrouped { if seen.insert(element.name().to_string()) { - Self::push_class_lines(&mut lines, element, " "); + Self::push_class_lines(&mut lines, &mut deferred_members, element, " ", false); } } @@ -62,13 +64,21 @@ impl MermaidRenderer { let mut ns_seen: HashSet = HashSet::new(); for element in elements { if ns_seen.insert(element.name().to_string()) { - Self::push_class_lines(&mut lines, element, " "); + Self::push_class_lines( + &mut lines, + &mut deferred_members, + element, + " ", + true, + ); } } lines.push(" }".to_string()); } } + lines.extend(deferred_members); + let mut rel_seen: HashSet = HashSet::new(); for rel in graph.relationships() { if rel.kind() == RelationshipKind::Import { @@ -88,24 +98,32 @@ impl MermaidRenderer { lines.join("\n") } - fn push_class_lines(lines: &mut Vec, element: &CodeElement, indent: &str) { + fn push_class_lines( + lines: &mut Vec, + deferred: &mut Vec, + element: &CodeElement, + indent: &str, + in_namespace: bool, + ) { lines.push(format!( "{indent}class {}", Self::format_element_name(element) )); + + let member_target = if in_namespace { deferred } else { lines }; if element.visibility() != Visibility::Public { - lines.push(format!( - "{indent}<<{}>> {}", + member_target.push(format!( + " <<{}>> {}", Self::format_visibility(element.visibility()), element.name() )); } let name = element.name(); for field in element.fields() { - lines.push(format!("{indent}{name} : {field}")); + member_target.push(format!(" {name} : {field}")); } for method in element.methods() { - lines.push(format!("{indent}{name} : {method}")); + member_target.push(format!(" {name} : {method}")); } } diff --git a/docs/architecture/module.mmd b/docs/architecture/module.mmd index 4c3388e..9fee3bb 100644 --- a/docs/architecture/module.mmd +++ b/docs/architecture/module.mmd @@ -1,10 +1,10 @@ graph TD + Application[Application] Domain[Domain] Presentation[Presentation] Adapters[Adapters] - Application[Application] - Application --> Domain Adapters --> Domain + Application --> Domain + Presentation --> Application Presentation --> Domain - Presentation --> Adapters - Presentation --> Application \ No newline at end of file + Presentation --> Adapters \ No newline at end of file