traverse method

dynamic traverse(
  1. String selector
)

Implementation

dynamic traverse(String selector) {
  final parts = selector.split('.');
  var remaining = parts.length;

  dynamic current = _document?.contents.value;
  var traversed = '';
  var previousTraversed = '';
  for (final part in parts) {
    previousTraversed = traversed;
    if (traversed.isNotEmpty) {
      traversed += '.$part';
    } else {
      traversed += part;
    }

    if (remaining > 0) {
      if (part.contains('[')) {
        /// we have a list selector of the form 'attribute[n]'
        if (current is! YamlList) {
          throw SettingsYamlException('Expected a map at $traversed');
        }

        final matches = _indexRegx.allMatches(part);
        if (matches.length != 1) {
          throw SettingsYamlException(
              'Expected a index selector e.g. people[1] '
              'in $part at $traversed');
        }

        final key = matches.first.group(1);
        final index = int.parse(matches.first.group(2)!);
        current = current[index];

        if (current.keys.first != key) {
          throw SettingsYamlException('Expected a index selector of '
              '$previousTraversed.${current.keys.first}[$index]. '
              'Found $previousTraversed.$key[$index]');
        }
      } else {
        if (current is! YamlMap) {
          throw SettingsYamlException(
              'As $previousTraversed is a list expected $traversed to be a '
              'list index. e.g $traversed[i]');
        }
        current = current[part];
        if (current == null) {
          throw PathNotFoundException('Invalid path: $traversed');
        }
      }

      remaining--;
    }
  }
  return current;
}