traverse method
dynamic
traverse(
- 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;
}