fromNode static method

IPLDSelector fromNode(
  1. IPLDNode node
)

Creates an IPLDSelector from an IPLDNode

Implementation

static IPLDSelector fromNode(IPLDNode node) {
  if (node.kind != Kind.MAP) {
    throw IPLDDecodingError('Invalid selector format: expected MAP');
  }

  final type = SelectorType.values.firstWhere(
    (t) =>
        t.toString() ==
        node.mapValue.entries
            .firstWhere((e) => e.key == '.tag')
            .value
            .stringValue,
    orElse: () => throw IPLDDecodingError('Invalid selector type'),
  );

  return IPLDSelector(
    type: type,
    criteria:
        _decodeValue(
              node.mapValue.entries
                  .firstWhere(
                    (e) => e.key == 'criteria',
                    orElse: () => MapEntry()
                      ..key = 'criteria'
                      ..value = (IPLDNode()
                        ..kind = Kind.MAP
                        ..mapValue = IPLDMap()),
                  )
                  .value,
            )
            as Map<String, dynamic>,
    maxDepth: node.mapValue.entries
        .firstWhere(
          (e) => e.key == 'maxDepth',
          orElse: () => MapEntry()
            ..key = 'maxDepth'
            ..value = (IPLDNode()..kind = Kind.NULL),
        )
        .value
        .intValue
        .toInt(),
    subSelectors: node.mapValue.entries
        .firstWhere(
          (e) => e.key == 'selectors',
          orElse: () => MapEntry()
            ..key = 'selectors'
            ..value = (IPLDNode()
              ..kind = Kind.LIST
              ..listValue = IPLDList()),
        )
        .value
        .listValue
        .values
        .map((n) => fromNode(n))
        .toList(),
    fieldPath: node.mapValue.entries
        .firstWhere(
          (e) => e.key == 'path',
          orElse: () => MapEntry()
            ..key = 'path'
            ..value = (IPLDNode()..kind = Kind.NULL),
        )
        .value
        .stringValue,
    stopAtLink: node.mapValue.entries
        .firstWhere(
          (e) => e.key == 'stopAtLink',
          orElse: () => MapEntry()
            ..key = 'stopAtLink'
            ..value = (IPLDNode()..kind = Kind.NULL),
        )
        .value
        .boolValue,
  );
}