fromBytesAsync static method

Future<IPLDSelector> fromBytesAsync(
  1. Uint8List bytes
)

Creates an IPLDSelector from its CBOR byte representation

Implementation

static Future<IPLDSelector> fromBytesAsync(Uint8List bytes) async {
  final node = await _decodeBytes(bytes);

  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'),
  );

  final criteria = <String, dynamic>{};
  final criteriaEntry = node.mapValue.entries.firstWhere(
    (e) => e.key == 'criteria',
    orElse: () => MapEntry()
      ..key = 'criteria'
      ..value = (IPLDNode()
        ..kind = Kind.MAP
        ..mapValue = IPLDMap()),
  );
  for (final entry in criteriaEntry.value.mapValue.entries) {
    criteria[entry.key] = _decodeValue(entry.value);
  }

  final maxDepth = node.mapValue.entries
      .firstWhere(
        (e) => e.key == 'maxDepth',
        orElse: () => MapEntry()
          ..key = 'maxDepth'
          ..value = (IPLDNode()..kind = Kind.NULL),
      )
      .value
      .intValue
      .toInt();

  final 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) => IPLDSelector.fromNode(n))
      .toList();

  final fieldPath = node.mapValue.entries
      .firstWhere(
        (e) => e.key == 'path',
        orElse: () => MapEntry()
          ..key = 'path'
          ..value = (IPLDNode()..kind = Kind.NULL),
      )
      .value
      .stringValue;

  final stopAtLink = node.mapValue.entries
      .firstWhere(
        (e) => e.key == 'stopAtLink',
        orElse: () => MapEntry()
          ..key = 'stopAtLink'
          ..value = (IPLDNode()..kind = Kind.NULL),
      )
      .value
      .boolValue;

  return IPLDSelector(
    type: type,
    criteria: criteria,
    maxDepth: maxDepth,
    subSelectors: subSelectors,
    fieldPath: fieldPath,
    stopAtLink: stopAtLink,
  );
}