registerVectorType method

LegacyBCS registerVectorType(
  1. String typeName
)

Register custom vector type inside the bcs.

bcs.registerVectorType('vector<T>'); // generic registration
final array = bcs.de('vector<u8>', '06010203040506', Encoding.hex); // [1,2,3,4,5,6];
final again = bcs.ser('vector<u8>', [1,2,3,4,5,6]).hex();

Implementation

LegacyBCS registerVectorType(String typeName) {
  final (name, params) = parseTypeName(typeName);
  if (params.length > 1) {
    throw ArgumentError("Vector can have only one type parameter; got " + name);
  }

  return registerType(typeName, (writer, data, typeParams, typeMap) {
    return writer.writeVec(data, (writer, el, _, __) {
      if (typeParams.isEmpty) {
        throw ArgumentError("Incorrect number of type parameters passed a to vector '$typeName'");
      }

      final elementType = typeParams[0];
      final (name, params) = parseTypeName(elementType);
      if (hasType(name)) {
        return getTypeInterface(name).encodeRaw(writer, el, params, typeMap);
      }

      if (!(typeMap.containsKey(name))) {
        throw ArgumentError(
            "Unable to find a matching type definition for $name in vector; make sure you passed a generic");
      }

      final (innerName, innerParams) = parseTypeName(typeMap[name]);

      return getTypeInterface(innerName).encodeRaw(writer, el, innerParams, typeMap);
    });
  }, (reader, typeParams, typeMap) {
    return reader.readVec((reader, _, __) {
      if (typeParams.isEmpty) {
        throw ArgumentError("Incorrect number of type parameters passed to a vector '$typeName'");
      }

      final elementType = typeParams[0];
      final (name, params) = parseTypeName(elementType);
      if (hasType(name)) {
        return getTypeInterface(name).decodeRaw(reader, params, typeMap);
      }

      if (!(typeMap.containsKey(name))) {
        throw ArgumentError(
            "Unable to find a matching type definition for $name in vector; make sure you passed a generic");
      }

      final (innerName, innerParams) = parseTypeName(typeMap[name]);
      getTypeInterface(innerName).decodeRaw(reader, innerParams, typeMap);
    });
  });
}