registerType method

LegacyBCS registerType(
  1. dynamic typeName,
  2. EncodeCb encodeCb,
  3. DecodeCb decodeCb, [
  4. ValidateCb? validateCb,
])

Method to register new types for BCS internal representation. For each registered type 2 callbacks must be specified and one is optional:

  • encodeCb(writer, data) - write a way to serialize data with BcsWriter;
  • decodeCb(reader) - write a way to deserialize data with BcsReader;
  • validateCb(data) - validate data - either return bool or throw an error
// our type would be a string that consists only of numbers
bcs.registerType('number_string',
    (writer, data, _, __) => writer.writeVec(data, (w, el, _, __) => w.write8(int.parse(el.toString()))),
    (reader, _, __) => reader.readVec((r, _, __) => r.read8()).join(''), // read each value as u8
    (value) => RegExp("[0-9]+").hasMatch(value) // test that it has at least one digit
);
expect(bcs.ser('number_string', '12345').toBytes(), [5,1,2,3,4,5]);

Implementation

LegacyBCS registerType(TypeName typeName, EncodeCb encodeCb, DecodeCb decodeCb,
    [ValidateCb? validateCb]) {
  validateCb ??= (data) => true;

  final (name, generics) = parseTypeName(typeName);

  types[name] = TypeEncodeDecode(this, generics, encodeCb, decodeCb, validateCb);

  return this;
}