generateGenericSerializer method

String generateGenericSerializer(
  1. Map serializer
)

Implementation

String generateGenericSerializer(Map serializer) {
  final library = Library((lib) {
    final serializerReader = MapReader(serializer);
    final class_ = Class((b) {
      final name = serializerReader.read<String>('name');
      b.name = name;
      final types = serializerReader.read<List>('types');
      final typeNames = <String>{};
      for (final element in types) {
        final typeName = '$element';
        final type = _parseType(typeName);
        if (type.hasSuffix) {
          throw StateError(
              'Generic serializer does not support nullable types: $type');
        }

        if (type.arguments.isNotEmpty) {
          throw StateError(
              'Generic serializer does not support parametrized types: $type');
        }

        typeNames.add(type.name);
      }

      b.methods.add(Method((b) {
        b.static = true;
        b.returns = Reference('T');
        b.name = 'deserialize';
        b.types.add(Reference('T'));
        b.requiredParameters.add(Parameter((b) {
          b.name = 'json';
          b.type = Reference('Map');
        }));
        const template = r'''
const types = {{{types}}};
final fromJson = types[T];
if (fromJson != null) {
return fromJson(json) as T;
}

throw StateError('Unable to deserialize type $T');''';
        final values = {
          'types': typeNames.map((e) => '$e: $e.fromJson').join(',\n'),
        };
        b.body = Code(render(template, values));
      }));
    });

    lib.body.add(class_);
  });

  final emitter = DartEmitter();
  final result = library.accept(emitter).toString();
  return result;
}