parseStructure static method

AsyncReply<Structure> parseStructure(
  1. DC data,
  2. int offset,
  3. int length,
  4. DistributedConnection connection, [
  5. StructureMetadata? metadata = null,
  6. List<String>? keys = null,
  7. List<int>? types = null,
])
Parse a structure Bytes array Zero-indexed offset. Number of bytes to parse. DistributedConnection is required in case a structure in the array holds items at the other end. Array to store keys in. Array to store DataTypes in. Array of keys, in case the data doesn't include keys Array of DataTypes, in case the data doesn't include DataTypes

Implementation

static AsyncReply<Structure> parseStructure(
    DC data, int offset, int length, DistributedConnection connection,
    [StructureMetadata? metadata = null,
    List<String>? keys = null,
    List<int>? types =
        null]) // out string[] parsedKeys, out DataType[] parsedTypes, string[] keys = null, DataType[] types = null)
{
  var reply = new AsyncReply<Structure>();
  var bag = new AsyncBag<dynamic>();
  var keylist = <String>[];
  var typelist = <int>[];
  var sizeObject = new SizeObject();

  if (keys == null) {
    while (length > 0) {
      var len = data[offset++];
      keylist.add(data.getString(offset, len));
      offset += len;

      typelist.add(data[offset]);

      bag.add(Codec.parse(data, offset, connection, sizeObject));
      length -= sizeObject.size + len + 1;
      offset += sizeObject.size;
    }
  } else if (types == null) {
    keylist.addAll(keys);

    while (length > 0) {
      typelist.add(data[offset]);

      bag.add(Codec.parse(data, offset, connection, sizeObject));
      length -= sizeObject.size;
      offset += sizeObject.size;
    }
  } else {
    keylist.addAll(keys);
    typelist.addAll(types);

    var i = 0;
    while (length > 0) {
      bag.add(parse(data, offset, connection, sizeObject, types[i]));
      length -= sizeObject.size;
      offset += sizeObject.size;
      i++;
    }
  }

  bag.seal();

  bag.then((res) {
    // compose the list
    var s = new Structure();
    for (var i = 0; i < keylist.length; i++) s[keylist[i]] = res[i];
    reply.trigger(s);
  });

  if (metadata != null) {
    metadata.keys = keylist;
    metadata.types = typelist;
  }

  return reply;
}