parseProtoMessages function

List<ProtoMessage> parseProtoMessages(
  1. String content
)

Implementation

List<ProtoMessage> parseProtoMessages(String content) {
  final messages = <ProtoMessage>[];
  final messageStartRegex = RegExp(r'message\s+(\w+)\s*\{');
  final fieldRegex = RegExp(
    r'^\s*(repeated\s+)?([\w\.]+)\s+(\w+)\s*=\s*\d+\s*;',
    multiLine: true,
  );

  for (final messageMatch in messageStartRegex.allMatches(content)) {
    final messageName = messageMatch.group(1)!;
    final bodyStartIndex = messageMatch.end;

    // Find matching brace manually to handle nested blocks like enums or options
    int braceCount = 1;
    int bodyEndIndex = -1;
    for (int i = bodyStartIndex; i < content.length; i++) {
      if (content[i] == '{') braceCount++;
      if (content[i] == '}') braceCount--;
      if (braceCount == 0) {
        bodyEndIndex = i;
        break;
      }
    }

    if (bodyEndIndex != -1) {
      final messageBody = content.substring(bodyStartIndex, bodyEndIndex);
      final fields = <ProtoMessageField>[];

      for (final fieldMatch in fieldRegex.allMatches(messageBody)) {
        fields.add(
          ProtoMessageField(
            isRepeated: fieldMatch.group(1) != null,
            type: fieldMatch.group(2)!,
            name: fieldMatch.group(3)!,
          ),
        );
      }
      messages.add(ProtoMessage(name: messageName, fields: fields));
    }
  }
  return messages;
}