decode static method
Implementation
static List<ProtocolBufferDecoderResult> decode(
List<int> bytes,
List<ProtoFieldConfig> tags,
) {
final List<ProtocolBufferDecoderResult> results = [];
int index = 0;
while (index < bytes.length) {
final decodeTag = decodeVarint32(bytes, index);
index += decodeTag.consumed;
final int tag = decodeTag.value;
final int fieldId = tag >> 3;
final int wireType = tag & 0x07;
final type = WireType.fromValue(wireType);
final config = tags.firstWhereNullable((e) => e.fieldNumber == fieldId);
if (config == null) {
index += type.skip(bytes, index);
continue;
}
final decode = _decode(bytes, config, offset: index);
index += decode.consumed;
results.add(decode);
}
// results.sort((a, b) {});
List<ProtocolBufferDecoderResult> finalResult = [];
for (final i in tags) {
final same =
results.where((e) => e.fieldNumber == i.fieldNumber).toList();
if (same.isEmpty) continue;
final haveMulti =
i.fieldType == ProtoFieldType.repeated ||
i.fieldType == ProtoFieldType.map;
if (!haveMulti) {
assert(same.length == 1);
finalResult.addAll(same);
continue;
}
finalResult.add(
ProtocolBufferDecoderResult(
value: same.map((e) => e.value).expand((e) => e).toList(),
config: i,
consumed: same.fold(0, (p, c) => p + c.consumed),
),
);
}
return finalResult;
}