getAccessibleTypes method

Map<int, int> getAccessibleTypes(
  1. Map<int, LookupValue> definitions
)

Implementation

Map<int, int> getAccessibleTypes(Map<int, LookupValue> definitions) {
  final Set<int> types = {};

  void collectTypesFromId(int id) {
    if (types.contains(id)) return;

    final def = definitions[id]!.def;

    switch (def.tag) {
      case 'composite':
        if (def.value.isEmpty) break;
        types.add(id);
        for (var v in def.value) {
          collectTypesFromId(v.type);
        }
        break;
      case 'variant':
        if (def.value.isEmpty) break;
        types.add(id);
        for (var v in def.value) {
          for (var f in v.fields) {
            collectTypesFromId(f.type);
          }
        }
        break;
      case 'tuple':
        if (def.value.isEmpty) break;
        types.add(id);
        for (var type in def.value) {
          collectTypesFromId(type);
        }
        break;
      case 'sequence':
        types.add(id);
        collectTypesFromId(def.value);
        break;
      case 'array':
        types.add(id);
        collectTypesFromId(def.value.type);
        break;
      case 'bitSequence':
        types.add(id);
        break;
    }
  }

  collectTypesFromId(metadata.extrinsic.callType);
  collectTypesFromId(metadata.extrinsic.addressType);
  collectTypesFromId(metadata.extrinsic.signatureType);

  for (var ext in metadata.extrinsic.signedExtensions) {
    collectTypesFromId(ext.type);
    collectTypesFromId(ext.additionalSigned);
  }

  final List<int> sorted = types.toList()..sort();
  return sorted.asMap().map((key, value) => MapEntry(value, key));
}