generateMermaid method

String generateMermaid(
  1. ArchitectureGraph graph
)

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();
}