generateConverter<T extends Object?> method

void generateConverter<T extends Object?>(
  1. StringBuffer buffer,
  2. ClassModel model
)

Generate converter for the data classes file.

Implementation

void generateConverter<T extends Object?>(
  final StringBuffer buffer,
  final ClassModel model,
) {
  String converter = model.name.endsWith('Model')
      ? model.name.substring(0, model.name.length - 5)
      : model.name;
  converter += 'Converter';
  String converterName = converter.decapitalize();
  converterName =
      converterName == converter ? '\$$converterName' : converterName;

  final String optionalConverter = 'Optional$converter';
  buffer
    ..writeDoc('The optional converter of the [${model.name}].')
    ..writeln(
      'const $optionalConverter ${optionalConverter.decapitalize()} = '
      '$optionalConverter._();',
    )
    ..writeln()
    ..writeDoc('The optional converter of the [${model.name}].')
    ..writeln('@sealed')
    ..writeln('@immutable')
    ..writeln(
      'class $optionalConverter implements '
      'JsonConverter<${model.name}?, Map<String, Object?>?> {',
    )
    ..writeln('const $optionalConverter._();')
    ..writeln()
    ..writeln('@override')
    ..writeFunction(
      '${model.name}? fromJson',
      fields: <String>['final Map<String, Object?>? value'],
      bodyConstructor: 'value == null ? null : ${model.name}.fromMap',
      bodyFields: <String>['value'],
    )
    ..writeln()
    ..writeln('@override')
    ..writeFunction(
      'Map<String, Object?>? toJson',
      fields: <String>['final ${model.name}? value'],
      bodyConstructor: 'value?.toMap',
    )
    ..writeln('}')
    ..writeln()
    ..writeDoc('The converter of the [${model.name}].')
    ..writeln(
      'const $converter $converterName = $converter._();',
    )
    ..writeln()
    ..writeDoc('The converter of the [${model.name}].')
    ..writeln('@sealed')
    ..writeln('@immutable')
    ..writeln(
      'class $converter implements '
      'JsonConverter<${model.name}, Map<String, Object?>> {',
    )
    ..writeln('const $converter._();')
    ..writeln()
    ..writeln('@override')
    ..writeFunction(
      '${model.name} fromJson',
      fields: <String>['final Map<String, Object?> value'],
      bodyConstructor: '${model.name}.fromMap',
      bodyFields: <String>['value'],
    )
    ..writeln()
    ..writeln('@override')
    ..writeFunction(
      'Map<String, Object?> toJson',
      fields: <String>['final ${model.name} value'],
      bodyConstructor: 'value.toMap',
    )
    ..writeln('}');
}