Multiaddr.fromUint8List constructor

Multiaddr.fromUint8List(
  1. Uint8List addr
)

Implementation

factory Multiaddr.fromUint8List(Uint8List addr) {
  if (addr.isEmpty) {
    throw MultiaddrException('addr is empty');
  }
  var pos = 0; // current position in addr.
  var components = <Component>[];
  while (pos < addr.length) {
    var (vcode, len) = varintDecoder(addr.sublist(pos));
    pos += len;
    Protocol protocol;
    try {
      protocol = Protocol.fromCode(vcode);
    } on ProtocolException catch (e) {
      throw MultiaddrException(e.message);
    }
    switch (protocol.size) {
      case == 0:
        // no value.
        components.add(Component(protocol));
        break;
      case > 0:
        // fixed length.
        var listLen = (protocol.size / 8).ceil();
        if (pos + listLen > addr.length) {
          throw MultiaddrException(
              'protocol ${protocol.name} requires value');
        }
        var value = addr.sublist(pos, pos + listLen);
        pos += listLen;
        components.add(Component(protocol, value));
        break;
      default:
        // variable length.
        var (valSize, len) = varintDecoder(addr.sublist(pos));
        pos += len;
        if (pos + len > addr.length) {
          throw MultiaddrException(
              'protocol ${protocol.name} requires value');
        }
        var valLen = (valSize / 8).ceil();
        var value = addr.sublist(pos, pos + valLen);
        pos += valLen;
        components.add(Component(protocol, value));
    }
  }
  return Multiaddr(components);
}