fix: sanitize mermaid member syntax (colons, angle brackets, refs)
Some checks failed
CI / Check / Test (push) Failing after 1m32s
Architecture Docs / Generate diagrams (push) Successful in 3m19s

This commit is contained in:
2026-06-17 10:23:11 +02:00
parent e93c8c8f9b
commit 84e5cc4f7e

View File

@@ -136,10 +136,10 @@ impl MermaidRenderer {
}
let name = element.name();
for field in element.fields() {
member_target.push(format!(" {name} : {field}"));
member_target.push(format!(" {name} : {}", sanitize_member(field)));
}
for method in element.methods() {
member_target.push(format!(" {name} : {method}"));
member_target.push(format!(" {name} : {}", sanitize_member(method)));
}
}
@@ -274,6 +274,20 @@ impl MermaidRenderer {
}
}
// Sanitize a field/method string for Mermaid classDiagram member syntax.
// Mermaid uses `ClassName : member` — it cannot handle colons inside the
// member (Rust's `field: Type`), nor reference/lifetime syntax (`&`, `'`),
// nor angle-bracket generics (`<`, `>`).
fn sanitize_member(s: &str) -> String {
// Convert `name: Type` → `name Type` (drop the colon)
let no_colon = s.replace(": ", " ").replace(':', " ");
// Strip chars that break the Mermaid grammar
no_colon
.replace(['&', '\''], "")
.replace('<', "[")
.replace('>', "]")
}
impl DiagramRenderer for MermaidRenderer {
fn render(&self, graph: &CodeGraph) -> Result<RenderOutput, DomainError> {
let content = match self.level {