generateModels method

Future<void> generateModels(
  1. Map<String, dynamic> json
)

Implementation

Future<void> generateModels(Map<String, dynamic> json) async {
  final definitions = json['definitions'] as Map<String, dynamic>?;
  final models = <Model>[];

  const indent = '  ';

  if (definitions != null) {
    definitions.forEach((name, definition) async {
      final buffer = StringBuffer();
      buffer.write('$indent$name({\n');
      final properties = definition['properties'] as Map<String, dynamic>?;
      if (properties != null) {
        properties.forEach((propertyName, property) {
          final require =
              (definition['required'] as List?)?.contains(propertyName) ??
                  false;
          buffer.write(
              '$indent$indent${require ? 'required ' : ''}this.$propertyName');
          buffer.write(',\n');
        });
      }
      buffer.write('$indent});\n\n');
      if (properties != null) {
        properties.forEach((propertyName, property) {
          if (property['description'] != null) {
            buffer.write('$indent/// ${property['description']} \n');
          }
          final dartType = _mapType(property);
          final require =
              (definition['required'] as List?)?.contains(propertyName) ??
                  false;
          buffer.write(
              '$indent$dartType${require ? '' : '?'} $propertyName; \n\n');
        });
      }

      buffer.write(
          '${indent}factory $name.fromJson(Map<String, dynamic> json) => $name(\n');

      if (properties != null) {
        properties.forEach((propertyName, property) {
          final dartType = _mapType(property);
          buffer.write('$indent$indent$propertyName: ');
          if (property['type'] == 'array') {
            var subType = dartType.substring(5, dartType.length - 1);
            buffer.write(
                'List<$subType>.from(json["$propertyName"].map((x) => ${baseType.contains(subType) ? 'x' : '$subType.fromJson(x)'})),\n');
          } else if (!baseType.contains(dartType)) {
            buffer.write('$dartType.fromJson(json["$propertyName"]),\n');
          } else {
            buffer.write('json["$propertyName"],\n');
          }
        });
      }
      buffer.write('$indent);\n\n');
      buffer.write('${indent}Map<String, dynamic> toJson() => {\n');
      if (properties != null) {
        properties.forEach((propertyName, property) {
          buffer.write('$indent$indent"$propertyName": ');
          final dartType = _mapType(property);
          if (property['type'] == 'array') {
            final require =
                (definition['required'] as List?)?.contains(propertyName) ??
                    false;
            var subType = dartType.substring(5, dartType.length - 1);

            if (require) {
              buffer.write(
                  '$propertyName.map((e) => ${baseType.contains(subType) ? 'e' : 'e.toJson()'}).toList(),\n');
            } else {
              buffer.write(
                  '$propertyName != null ? $propertyName!.map((e) => ${baseType.contains(subType) ? 'e' : 'e.toJson()'}).toList() : null,\n');
            }
          } else if (!baseType.contains(dartType)) {
            final require =
                (definition['required'] as List?)?.contains(propertyName) ??
                    false;
            if (require) {
              buffer.write('$propertyName.toJson(),\n');
            } else {
              buffer.write(
                  '$propertyName != null ? $propertyName!.toJson() : null,\n');
            }
          } else {
            buffer.write('$propertyName,\n');
          }
        });
      }
      buffer.write('$indent};\n');
      models.add(Model(name, buffer.toString()));
    });
  }
  final buffer = StringBuffer();
  for (final model in models) {
    buffer.write('$model\n');
  }
  final filePath = '$outputDir/models.dart';
  final file = File(filePath);
  await generateFile(file, buffer.toString());
}