in lib/message_format.dart [464:512]
Queue<_ElementTypeAndVal> _extractParts(String pattern) {
var prevPos = 0;
var braceStack = Queue<String>();
var results = Queue<_ElementTypeAndVal>();
var braces = RegExp('[{}]');
Match match;
for (match in braces.allMatches(pattern)) {
var pos = match.start;
if (match[0] == '}') {
String? brace;
try {
brace = braceStack.removeLast();
} on StateError {
_checkAndThrow(brace != '}', 'No matching } for {.');
}
_checkAndThrow(brace == '{', 'No matching { for }.');
if (braceStack.isEmpty) {
// End of the block.
var part = _ElementTypeAndVal(
_ElementType.block, pattern.substring(prevPos, pos));
results.add(part);
prevPos = pos + 1;
}
} else {
if (braceStack.isEmpty) {
var substring = pattern.substring(prevPos, pos);
if (substring != '') {
results.add(_ElementTypeAndVal(_ElementType.string, substring));
}
prevPos = pos + 1;
}
braceStack.add('{');
}
}
// Take care of the final string, and check if the braceStack is empty.
_checkAndThrow(
braceStack.isEmpty, 'There are mismatched { or } in the pattern.');
var substring = pattern.substring(prevPos);
if (substring != '') {
results.add(_ElementTypeAndVal(_ElementType.string, substring));
}
return results;
}