decode static method

Implementation

static ReducerResultMessage decode(BsatnDecoder decoder) {
  final requestId = decoder.readU32();
  final timestamp = decoder.readU64();
  final outcomeTag = decoder.readU8();

  UpdateStatus status;
  Uint8List? retValue;
  List<QuerySetUpdate> querySets;

  if (outcomeTag == 0) {
    // Ok(ReducerOk { ret_value: Bytes, transaction_update: TransactionUpdate })
    final retLen = decoder.readU32();
    final retBytes = decoder.readBytes(retLen);
    retValue = retLen == 0 ? null : retBytes;
    querySets = decoder.readList(() => QuerySetUpdate.decode(decoder));
    status = Committed();
  } else if (outcomeTag == 1) {
    // OkEmpty — unit; zero ret, zero query_sets.
    retValue = null;
    querySets = const [];
    status = Committed();
  } else if (outcomeTag == 2) {
    // Err(Bytes)
    final errLen = decoder.readU32();
    final errBytes = decoder.readBytes(errLen);
    retValue = null;
    querySets = const [];
    status = Failed(errBytes);
  } else if (outcomeTag == 3) {
    // InternalError(Box<str>)
    final message = decoder.readString();
    retValue = null;
    querySets = const [];
    status = InternalError(message);
  } else {
    throw ArgumentError('Unknown ReducerOutcome tag: $outcomeTag');
  }

  return ReducerResultMessage(
    requestId: requestId,
    timestamp: timestamp,
    status: status,
    retValue: retValue,
    querySets: querySets,
  );
}