write method

String write()

Implementation

String write() {
  final sb = StringBuffer();
  final imports = <String>{}
    ..add("import 'package:json_annotation/json_annotation.dart';");
  (jsonModel.extraImports ?? pubspecConfig.extraImports)
      .forEach((element) => imports.add('import \'$element\';'));

  jsonModel.fields.forEach((field) {
    final type = field.type;
    if (!TypeChecker.isKnownDartType(type.name)) {
      imports.addAll(_getImportsFromPath(type.name));
    }
    if (type is MapType && !TypeChecker.isKnownDartType(type.valueName)) {
      imports.addAll(_getImportsFromPath(type.valueName));
    }
  });
  jsonModel.converters.forEach((converter) {
    imports.addAll(_getImportsFromPath(converter));
  });
  imports.forEach(sb.writeln);

  sb
    ..writeln()
    ..writeln("part '${jsonModel.fileName}.g.dart';")
    ..writeln()
    ..writeln('@JsonSerializable()');
  (jsonModel.extraAnnotations ?? pubspecConfig.extraAnnotations)
      .forEach(sb.writeln);

  jsonModel.converters.forEach((converter) {
    sb.writeln('@$converter()');
  });

  sb.writeln('class ${jsonModel.name} {');

  jsonModel.fields.sort((a, b) {
    final b1 = a.isRequired ? 1 : 0;
    final b2 = b.isRequired ? 1 : 0;
    return b2 - b1;
  });

  jsonModel.fields.forEach((key) {
    sb.write("  @JsonKey(name: '${key.serializedName}'");
    if (key.isRequired) {
      sb.write(', required: true');
    }

    if (!key.includeIfNull) {
      sb.write(', includeIfNull: false');
    }

    if (key.ignore) {
      sb.write(', ignore: true');
    }

    if (key.unknownEnumValue != null) {
      sb.write(
          ', unknownEnumValue: ${key.type.name}.${key.unknownEnumValue}');
    }

    final fieldModel = yamlConfig.getModelByName(key.type);
    if (fieldModel is CustomFromToJsonModel) {
      sb.write(', fromJson: handle${fieldModel.name}FromJson');
    }
    if (fieldModel is CustomFromToJsonModel) {
      sb.write(', toJson: handle${fieldModel.name}ToJson');
    }
    sb.writeln(')');
    if (key.nonFinal) {
      sb.write('  ');
    } else {
      sb.write('  final ');
    }
    final nullableFlag = key.isRequired ? '' : '?';
    final keyType = key.type;
    if (keyType is ArrayType) {
      sb.writeln('List<${keyType.name}>$nullableFlag ${key.name};');
    } else if (keyType is MapType) {
      sb.writeln(
          'Map<${keyType.name}, ${keyType.valueName}>$nullableFlag ${key.name};');
    } else {
      sb.writeln('${key.type.name}$nullableFlag ${key.name};');
    }
  });

  final anyNonFinal = jsonModel.fields.any((element) => element.nonFinal);
  sb
    ..writeln()
    ..writeln('  ${anyNonFinal ? '' : 'const '}${jsonModel.name}({');

  jsonModel.fields.forEach((key) {
    if (key.isRequired) {
      sb.writeln('    required this.${key.name},');
    } else {
      sb.writeln('    this.${key.name},');
    }
  });
  sb..writeln('  });')..writeln();
  if (jsonModel.generateForGenerics) {
    sb.writeln(
        '  factory ${jsonModel.name}.fromJson(Object? json) => _\$${jsonModel.name}FromJson(json as Map<String, dynamic>); // ignore: avoid_as');
  } else {
    sb.writeln(
        '  factory ${jsonModel.name}.fromJson(Map<String, dynamic> json) => _\$${jsonModel.name}FromJson(json);');
  }
  sb
    ..writeln()
    ..writeln(
        '  Map<String, dynamic> toJson() => _\$${jsonModel.name}ToJson(this);');

  if (jsonModel.equalsAndHashCode ?? pubspecConfig.equalsHashCode) {
    sb
      ..writeln()
      ..writeln('  @override')
      ..writeln('  bool operator ==(Object other) =>')
      ..writeln('      identical(this, other) ||')
      ..writeln('      other is ${jsonModel.name} &&')
      ..write('          runtimeType == other.runtimeType');
    jsonModel.fields.forEach((field) {
      sb.write(' &&\n          ${field.name} == other.${field.name}');
    });
    sb
      ..writeln(';')
      ..writeln()
      ..writeln('  @override')
      ..writeln('  int get hashCode =>');
    var c = 0;
    jsonModel.fields.forEach((field) {
      if (c++ > 0) sb.write(' ^\n');
      sb.write('      ${field.name}.hashCode');
    });
    sb.writeln(';');
  }
  if (jsonModel.generateToString ?? pubspecConfig.generateToString) {
    sb
      ..writeln()
      ..writeln('  @override')
      ..writeln('  String toString() =>')
      ..writeln('      \'${jsonModel.name}{\'');

    var c = 0;
    jsonModel.fields.forEach((field) {
      if (c++ > 0) sb.writeln(', \'');
      sb.write('      \'${field.name}: \$${field.name}');
    });
    sb.writeln('\'\n      \'}\';');
  }

  sb..writeln()..writeln('}');
  return sb.toString();
}