generateModels method
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());
}