parseArrayHeaderLine function

({ArrayHeaderInfo header, String? inlineValues})? parseArrayHeaderLine(
  1. String content,
  2. String defaultDelimiter
)

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