decode method

Implementation

RitoTextInteractionResponse decode(Uint8List bytes) {
  if (bytes.length > ritoMaxWireBytes) {
    throw const FormatException('RITOTIR1 exceeds the byte limit.');
  }
  final reader = RitoBinaryReader(bytes);
  reader.expectMagic(_magic, 'text interaction magic');
  final version = reader.uint32('text interaction wire version');
  if (version != 1) {
    reader.fail('unsupported text interaction wire version: $version');
  }
  if (reader.uint64('text interaction total length') != bytes.length) {
    reader.fail('text interaction total length does not match input');
  }
  final artifactId = reader.externalId('text interaction artifact id');
  final tag = reader.uint8('text interaction result tag');
  final RitoTextInteractionResult result = switch (tag) {
    0 => RitoCaretResult(_caret(reader)),
    1 => _selectionResult(reader),
    2 => const RitoMissResult(),
    3 => RitoBoundaryResult(_tag(reader, RitoSelectionBoundary.values)),
    4 => RitoPendingResult(_tag(reader, RitoSelectionBoundary.values)),
    5 => RitoUnavailableResult(
      _tag(reader, RitoTextInteractionUnavailableReason.values),
    ),
    _ => reader.fail('unknown text interaction result tag: $tag'),
  };
  reader.finish('text interaction wire message');
  return RitoTextInteractionResponse(artifactId: artifactId, result: result);
}