generateToMapMethod method

void generateToMapMethod(
  1. ClassBuilder clazz,
  2. BuildContext ctx,
  3. LibraryBuilder file
)

Implementation

void generateToMapMethod(
    ClassBuilder clazz, BuildContext ctx, LibraryBuilder file) {
  var originalClassName = ctx.originalClassName;
  if (originalClassName == null) {
    log.warning('Unable to generate toMap(), classname is null');
    return;
  }
  clazz.methods.add(Method((method) {
    method
      ..static = true
      ..name = 'toMap'
      ..returns = Reference('Map<String, dynamic>')
      ..requiredParameters.add(Parameter((b) {
        b
          ..name = 'model'
          ..type = TypeReference((b) => b
            ..symbol = originalClassName
            ..isNullable = true);
      }));

    var buf = StringBuffer();

    /*
    ctx.requiredFields.forEach((key, msg) {
      if (ctx.excluded[key]?.canSerialize == false) return;
      buf.writeln('''
      if (model.$key == null) {
        throw FormatException("$msg");
      }
      ''');
    });
    */

    buf.writeln('return {');
    var i = 0;

    // Add named parameters
    for (var field in ctx.fields) {
      var type = ctx.resolveSerializedFieldType(field.name);

      // Skip excluded fields
      if (ctx.excluded[field.name]?.canSerialize == false) continue;

      var alias = ctx.resolveFieldName(field.name);

      if (i++ > 0) buf.write(', ');

      var serializedRepresentation = 'model.${field.name}';

      String serializerToMap(ReCase rc, String value) {
        // if (rc.pascalCase == ctx.modelClassName) {
        //   return '($value)?.toJson()';
        // }
        return '${rc.pascalCase.replaceAll('?', '')}Serializer.toMap($value)';
      }

      var fieldNameSerializer = ctx.fieldInfo[field.name]?.serializer;
      if (fieldNameSerializer != null) {
        var name = MirrorSystem.getName(fieldNameSerializer);
        serializedRepresentation = '$name(model.${field.name})';
      }

      // Serialize dates
      else if (dateTimeTypeChecker.isAssignableFromType(type)) {
        var question =
            field.type.nullabilitySuffix == NullabilitySuffix.question
                ? "?"
                : "";
        serializedRepresentation =
            'model.${field.name}$question.toIso8601String()';
      }

      // Serialize model classes via `XSerializer.toMap`
      else if (isModelClass(type)) {
        var rc = ReCase(type.getDisplayString(withNullability: true));
        serializedRepresentation = serializerToMap(rc, 'model.${field.name}');
      } else if (type is InterfaceType) {
        if (isListOfModelType(type)) {
          var name =
              type.typeArguments[0].getDisplayString(withNullability: true);
          if (name.startsWith('_')) name = name.substring(1);
          var rc = ReCase(name);
          var m = serializerToMap(rc, 'm');

          var question =
              (field.type.nullabilitySuffix == NullabilitySuffix.question)
                  ? '?'
                  : '';
          serializedRepresentation =
              'model.${field.name}$question.map((m) => $m).toList()';
          log.fine('serializedRepresentation => $serializedRepresentation');
        } else if (isMapToModelType(type)) {
          var rc = ReCase(
              type.typeArguments[1].getDisplayString(withNullability: true));
          serializedRepresentation =
              '''model.${field.name}.keys.fold({}, (map, key) {
            return map..[key] =
            ${serializerToMap(rc, 'model.${field.name}[key]')};
          })''';
        } else if (type.element is Enum) {
          var convert =
              (field.type.nullabilitySuffix == NullabilitySuffix.question)
                  ? '!'
                  : '';

          serializedRepresentation = '''
          model.${field.name} != null ?
            ${type.getDisplayString(withNullability: false)}.values.indexOf(model.${field.name}$convert)
            : null
          ''';
        } else if (const TypeChecker.fromRuntime(Uint8List)
            .isAssignableFromType(type)) {
          var convert =
              (field.type.nullabilitySuffix == NullabilitySuffix.question)
                  ? '!'
                  : '';

          serializedRepresentation = '''
          model.${field.name} != null ?
            base64.encode(model.${field.name}$convert)
            : null
          ''';
        }
      }

      buf.write("'$alias': $serializedRepresentation");
    }

    buf.write('};');
    method.body = Block.of([
      Code(
          'if (model == null) { throw FormatException("Required field [model] cannot be null"); }'),
      Code(buf.toString()),
    ]);
  }));
}