parseArrayHeaderLine function
Parses an array header line
Implementation
({ArrayHeaderInfo header, String? inlineValues})? parseArrayHeaderLine(
String content, String defaultDelimiter) {
// Don't match if the line starts with a quote (it's a quoted key, not an array)
if (content.trim().startsWith(doubleQuote)) {
return null;
}
// Find the bracket segment first
final bracketStart = content.indexOf(openBracket);
if (bracketStart == -1) {
return null;
}
final bracketEnd = content.indexOf(closeBracket, bracketStart);
if (bracketEnd == -1) {
return null;
}
// Find the colon that comes after all brackets and braces
int colonIndex = bracketEnd + 1;
int braceEnd = colonIndex;
// Check for fields segment (braces come after bracket)
final braceStart = content.indexOf(openBrace, bracketEnd);
if (braceStart != -1 && braceStart < content.indexOf(colon, bracketEnd)) {
final foundBraceEnd = content.indexOf(closeBrace, braceStart);
if (foundBraceEnd != -1) {
braceEnd = foundBraceEnd + 1;
}
}
// Now find colon after brackets and braces
colonIndex = content.indexOf(colon, braceEnd.clamp(0, content.length));
if (colonIndex == -1) {
return null;
}
final key = bracketStart > 0 ? content.substring(0, bracketStart) : null;
final afterColon = content.substring(colonIndex + 1).trim();
final bracketContent = content.substring(bracketStart + 1, bracketEnd);
// Try to parse bracket segment
final parsedBracket = _parseBracketSegment(bracketContent, defaultDelimiter);
final length = parsedBracket.length;
final delimiter = parsedBracket.delimiter;
final hasLengthMarker = parsedBracket.hasLengthMarker;
// Check for fields segment
List<String>? fields;
if (braceStart != -1 && braceStart < colonIndex) {
final foundBraceEnd = content.indexOf(closeBrace, braceStart);
if (foundBraceEnd != -1 && foundBraceEnd < colonIndex) {
final fieldsContent = content.substring(braceStart + 1, foundBraceEnd);
fields = parseDelimitedValues(fieldsContent, delimiter)
.map(_parseStringLiteral)
.toList();
}
}
return (
header: ArrayHeaderInfo(
key: key,
length: length,
delimiter: delimiter,
fields: fields,
hasLengthMarker: hasLengthMarker,
),
inlineValues: afterColon.isNotEmpty ? afterColon : null,
);
}