write method

String write()

Implementation

String write() {
  final sb = StringBuffer()
    ..writeln(ObjectModelWriter.autoGeneratedWarning)
    ..writeln()
    ..writeln("import 'package:json_annotation/json_annotation.dart';")
    ..writeln();

  final modelDescription = jsonModel.description?.trim();
  if (modelDescription != null && modelDescription.isNotEmpty) {
    sb.writeln("///$modelDescription");
  }

  final jsonModelName = CaseUtil(jsonModel.name);
  final itemTypeName = CaseUtil(jsonModel.itemType.name);

  sb.writeln('enum ${jsonModelName.pascalCase} {');
  jsonModel.fields?.forEach((key) {
    final jsonValue = key.value == null || key.value?.isEmpty == null
        ? key.serializedName
        : key.value;
    final description = key.description;
    if (description != null) {
      sb.writeln('  ///$description');
    }
    if (jsonModel.itemType is StringType) {
      sb.writeln('  @JsonValue(\'$jsonValue\')');
    } else if (jsonModel.itemType is DoubleType && jsonValue != null) {
      final doubleValue = double.tryParse(jsonValue);
      sb.writeln('  @JsonValue($doubleValue)');
    } else {
      sb.writeln('  @JsonValue($jsonValue)');
    }
    sb.writeln('  ${key.name},');
  });
  sb.writeln('}');

  if (jsonModel.generateMap) {
    sb
      ..writeln()
      ..writeln('const ${jsonModelName.camelCase}Mapping = {');

    jsonModel.fields?.forEach((key) {
      final jsonValue = key.value == null || key.value?.isEmpty == null
          ? key.serializedName
          : key.value;
      sb.write('  ${jsonModelName.pascalCase}.${key.name}: ');
      if (jsonModel.itemType is StringType) {
        sb.writeln('\'$jsonValue\',');
      } else if (jsonModel.itemType is DoubleType && jsonValue != null) {
        final doubleValue = double.tryParse(jsonValue);
        sb.writeln('$doubleValue,');
      } else {
        sb.writeln('$jsonValue,');
      }
    });

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

    if (jsonModel.itemType is DoubleType) {
      sb.writeln('final reverse${jsonModelName.pascalCase}Mapping = {');
    } else {
      sb.writeln('const reverse${jsonModelName.pascalCase}Mapping = {');
    }

    jsonModel.fields?.forEach((key) {
      final jsonValue = key.value == null || key.value?.isEmpty == null
          ? key.serializedName
          : key.value;
      if (jsonModel.itemType is StringType) {
        sb.write('  \'$jsonValue\': ');
      } else if (jsonModel.itemType is DoubleType && jsonValue != null) {
        final doubleValue = double.tryParse(jsonValue);
        sb.write('  $doubleValue: ');
      } else {
        sb.write('  $jsonValue: ');
      }
      sb.writeln('${jsonModelName.pascalCase}.${key.name},');
    });

    sb.writeln('};');

    if (jsonModel.generateExtensions) {
      sb
        ..writeln()
        ..writeln(
            'extension ${jsonModelName.pascalCase}Extension on ${jsonModelName.pascalCase} {')
        ..writeln(
            '  ${itemTypeName.originalText} get ${itemTypeName.camelCase}Value => ${jsonModelName.camelCase}Mapping[this]!;')
        ..writeln('}')
        ..writeln()
        ..writeln(
            'extension ${jsonModelName.pascalCase}${itemTypeName.pascalCase}Extension on ${itemTypeName.originalText} {')
        ..writeln(
            '  ${jsonModelName.pascalCase}? get as${jsonModelName.pascalCase} => reverse${jsonModelName.pascalCase}Mapping[this];')
        ..writeln('}');
    }
  }

  return sb.toString();
}