generateMermaid method
Generates a Mermaid graph TD diagram string for graph.
Implementation
String generateMermaid(ArchitectureGraph graph) {
final buffer = StringBuffer();
buffer.writeln('graph TD');
buffer.writeln(' %% Legend');
buffer.writeln(' classDef logic fill:#673ab7,stroke:#9575cd,color:#fff');
buffer.writeln(' classDef widget fill:#1565c0,stroke:#64b5f6,color:#fff');
buffer.writeln(
' classDef provider fill:#ef6c00,stroke:#ffb74d,color:#fff',
);
buffer.writeln(' classDef usage fill:#37474f,stroke:#90a4ae,color:#fff');
// 1. Define nodes with semantic labels
for (final entry in graph.nodes.entries) {
final id = _escape(entry.key);
final node = entry.value;
if (node is LogicUnitNode) {
final role = node.role.toUpperCase();
buffer.writeln(' $id["$role: ${node.name}"]');
buffer.writeln(' class $id logic');
} else if (node is WidgetNode) {
buffer.writeln(' $id["WIDGET: ${node.widgetName}"]');
buffer.writeln(' class $id widget');
} else if (node is ProviderDeclarationNode) {
buffer.writeln(' $id{{"PROVIDER: ${node.providerType}"}}');
buffer.writeln(' class $id provider');
} else {
buffer.writeln(' $id["${_describeNode(node)}"]');
buffer.writeln(' class $id usage');
}
}
// 2. Define edges
for (final edge in graph.edges) {
final from = _escape(edge.fromId);
final to = _escape(edge.toId);
switch (edge.type) {
case RelationshipType.watches:
buffer.writeln(' $to -.->|WATCHES| $from');
break;
case RelationshipType.reads:
buffer.writeln(' $to -.->|READS| $from');
break;
case RelationshipType.provides:
buffer.writeln(' $from ===>|PROVIDES| $to');
break;
case RelationshipType.calls:
buffer.writeln(' $from -->|CALLS| $to');
break;
default:
buffer.writeln(' $from --> $to');
}
}
return buffer.toString();
}