generateClass method

void generateClass(
  1. List<int> serializers,
  2. BuildContext ctx,
  3. LibraryBuilder file
)

Generate a serializer class.

Implementation

void generateClass(
    List<int> serializers, BuildContext ctx, LibraryBuilder file) {
  log.fine('Generate serializer class');

  // Generate canonical codecs, etc.
  var pascal = ctx.modelClassNameRecase.pascalCase.replaceAll('?', '');
  var camel = ctx.modelClassNameRecase.camelCase.replaceAll('?', '');

  log.fine('Generating ${pascal}Serializer');

  if (ctx.constructorParameters.isEmpty) {
    log.fine("Constructor is empty");

    file.body.add(Code('''
const ${pascal}Serializer ${camel}Serializer = ${pascal}Serializer();

class ${pascal}Encoder extends Converter<$pascal, Map> {
const ${pascal}Encoder();

@override
Map convert($pascal model) => ${pascal}Serializer.toMap(model);
}

class ${pascal}Decoder extends Converter<Map, $pascal> {
const ${pascal}Decoder();

@override
$pascal convert(Map map) => ${pascal}Serializer.fromMap(map);
}
  '''));
  }

  file.body.add(Class((clazz) {
    clazz.name = '${pascal}Serializer';
    if (ctx.constructorParameters.isEmpty) {
      clazz.extend = TypeReference((b) => b
        ..symbol = 'Codec'
        ..types.addAll([ctx.modelClassType, refer('Map')]));

      // Add constructor, Codec impl, etc.
      clazz.constructors.add(Constructor((b) => b..constant = true));
      clazz.methods.add(Method((b) => b
        ..name = 'encoder'
        ..returns = refer('${pascal}Encoder')
        ..type = MethodType.getter
        ..annotations.add(refer('override'))
        ..body = refer('${pascal}Encoder').constInstance([]).code));
      clazz.methods.add(Method((b) => b
        ..name = 'decoder'
        ..returns = refer('${pascal}Decoder')
        ..type = MethodType.getter
        ..annotations.add(refer('override'))
        ..body = refer('${pascal}Decoder').constInstance([]).code));
    } else {
      clazz.abstract = true;
    }

    if (serializers.contains(Serializers.map)) {
      generateFromMapMethod(clazz, ctx, file);
    }

    if (serializers.contains(Serializers.map) ||
        serializers.contains(Serializers.json)) {
      generateToMapMethod(clazz, ctx, file);
    }
  }));
}