fromBytesAsync static method
- 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,
);
}