parseCondition function

Condition parseCondition(
  1. 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"');
  }
}