write method

String write()

Implementation

String write() {
  final sb = StringBuffer()
    ..writeln(ObjectModelWriter.autoGeneratedWarning)
    ..writeln()
    ..writeln("import 'package:json_annotation/json_annotation.dart';");
  if (jsonModel.generateExtension) {
    sb.writeln(
        "import 'package:model_generator/util/extension/list_extension.dart';");
  }

  sb.writeln();

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

  final jsonModelName = CaseUtil(jsonModel.name);
  final properties = jsonModel.properties;
  final keyProperty =
      properties.firstWhereOrNull((property) => property.isJsonvalue);
  final addDefaultJsonKey =
      keyProperty == null && jsonModel.addJsonValueToProperties;
  final addProperties = properties.isNotEmpty || addDefaultJsonKey;

  sb.writeln('enum ${jsonModelName.pascalCase} {');
  for (var key in jsonModel.fields) {
    final jsonValue = key.values
            .firstWhereOrNull(
                (value) => value.propertyName == keyProperty?.name)
            ?.value ??
        key.serializedName;
    final propertyType = keyProperty?.type;
    final isLast =
        jsonModel.fields.indexOf(key) == (jsonModel.fields.length - 1);

    if (key.description != null) {
      sb.writeln('  ///${key.description}');
    }
    if (propertyType is StringType || propertyType == null) {
      sb.writeln('  @JsonValue(\'$jsonValue\')');
    } else if (propertyType is DoubleType) {
      final doubleValue = double.tryParse(jsonValue);
      sb.writeln('  @JsonValue($doubleValue)');
    } else {
      sb.writeln('  @JsonValue($jsonValue)');
    }
    sb.write('  ${key.name}');

    if (addProperties) {
      sb.writeln('(');
      if (addDefaultJsonKey) {
        sb.writeln('    jsonValue: \'$jsonValue\',');
      }
      for (var property in properties) {
        final enumValue = valueForProperty(property.name, key.values);
        var value = enumValue?.value ?? property.defaultValue;

        sb.write('    ${property.name}: ');
        if (property.type is StringType &&
            (value != null || property.isJsonvalue)) {
          if (value == null && property.isJsonvalue) value = jsonValue;
          sb.writeln('\'$value\',');
        } else {
          sb.writeln('$value,');
        }
      }
      if (isLast) {
        sb.writeln('  );');
      } else {
        sb.writeln('  ),');
      }
    } else {
      sb.writeln(',');
    }
  }

  if (addProperties) {
    sb.writeln();
  }

  if (addDefaultJsonKey) {
    sb.writeln('  final String jsonValue;');
  }
  for (var property in properties) {
    sb.write('  final ${property.type.name}');
    if (property.isOptional) {
      sb.write('?');
    }
    sb.writeln(' ${property.name};');
  }
  if (addProperties) {
    sb.writeln();
    sb.writeln('  const ${jsonModelName.pascalCase}({');
    if (addDefaultJsonKey) {
      sb.writeln('    required this.jsonValue,');
    }
    for (var property in properties) {
      sb.write('    ');
      if (!property.isOptional) {
        sb.write('required ');
      }
      sb.writeln('this.${property.name},');
    }
    sb.writeln('  });');
  }
  sb.writeln('}');

  if (jsonModel.generateExtension) {
    final jsonValueName = addDefaultJsonKey ? 'jsonValue' : keyProperty?.name;
    final jsonValueType =
        addDefaultJsonKey ? StringType() : keyProperty?.type;
    final name = jsonModelName.pascalCase;
    sb.writeln();
    sb.writeln('extension ${name}Extension on $name {');
    sb.writeln(
        '  static $name? fromJsonValue(${jsonValueType?.name} value) => $name.values.firstWhereOrNull((enumValue) => enumValue.$jsonValueName == value);');
    sb.writeln('');
    sb.writeln('  ${jsonValueType?.name} toJsonValue() => $jsonValueName;');
    sb.writeln('}');
  }

  return sb.toString();
}