parsePath static method

List<Object> parsePath(
  1. String path
)

Implementation

static List<Object> parsePath(String path) {
  final trimmed = path.trim();
  if (trimmed.isEmpty) return const [];
  if (trimmed.startsWith('/')) {
    return [
      for (final part in trimmed.substring(1).split('/'))
        if (part.isNotEmpty)
          int.tryParse(part) ??
              Uri.decodeComponent(
                  part.replaceAll('~1', '/').replaceAll('~0', '~')),
    ];
  }

  final segments = <Object>[];
  final pattern = RegExp(r'([^.\[\]]+)|\[(\d+)\]');
  var index = 0;
  for (final match in pattern.allMatches(trimmed)) {
    if (match.start != index) {
      throw FormatException('unexpected character at index $index');
    }
    final key = match.group(1);
    final listIndex = match.group(2);
    if (key != null) {
      segments.add(key);
    } else if (listIndex != null) {
      segments.add(int.parse(listIndex));
    }
    index = match.end;
    if (index < trimmed.length && trimmed[index] == '.') {
      index++;
    }
  }
  if (index != trimmed.length) {
    throw FormatException('unexpected trailing character at index $index');
  }
  return segments;
}