parseProtoMessages function
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;
}