parseCondition function
- IPLDNode node
Parse a Condition from its data-model node.
Implementation
Condition parseCondition(IPLDNode node) {
if (node.kind != Kind.MAP) {
throw SelectorParseError('Condition must be a keyed-union map');
}
final entries = node.mapValue.entries;
if (entries.length != 1) {
throw SelectorParseError(
'Condition map must contain exactly one key, found ${entries.length}',
);
}
final key = entries.first.key;
final value = entries.first.value;
switch (key) {
case '/':
if (value.kind == Kind.LINK) {
return IsLinkCondition(target: _cidFromLinkNode(value));
}
if (value.kind == Kind.NULL) {
return const IsLinkCondition();
}
throw SelectorParseError('isLink condition must be a link or null');
case 'hasField':
return HasFieldCondition(_requireString(value, 'hasField condition'));
case '=':
return HasValueCondition(value);
case '%':
return HasKindCondition(_requireString(value, 'hasKind condition'));
case 'greaterThan':
return GreaterThanCondition(_requireNum(value, 'greaterThan'));
case 'lessThan':
return LessThanCondition(_requireNum(value, 'lessThan'));
case 'and':
final list = _requireList(value, 'and condition');
return AndCondition(list.values.map(parseCondition).toList());
case 'or':
final list = _requireList(value, 'or condition');
return OrCondition(list.values.map(parseCondition).toList());
default:
throw SelectorParseError('Unknown condition key: "$key"');
}
}