decode method

Implementation

RitoNavigationResult decode(Uint8List bytes) {
  if (bytes.length > ritoMaxWireBytes) {
    throw const FormatException('RITONVR1 exceeds the byte limit.');
  }
  final reader = RitoBinaryReader(bytes);
  reader.expectMagic(_magic, 'navigation magic');
  final version = reader.uint32('navigation wire version');
  if (version != 1) {
    reader.fail('unsupported navigation wire version: $version');
  }
  if (reader.uint64('navigation total length') != bytes.length) {
    reader.fail('navigation total length does not match input');
  }
  final tag = reader.uint8('navigation result tag');
  final RitoNavigationResult result = switch (tag) {
    0 => RitoTocEntryResult(
      reader.option('toc entry', () => reader.uint32('toc entry')),
    ),
    1 => RitoLocationResult(_location(reader)),
    2 => RitoOrderResult(_order(reader)),
    3 => RitoLayoutResult(readRitoRevisionLayout(reader)),
    _ => reader.fail('unknown navigation result tag: $tag'),
  };
  reader.finish('navigation wire message');
  return result;
}