emitClass method
Emits the Dart code for a given definition of a class.
Returns a String containing the full source code for the class, including safe imports and fromJson/toJson methods.
Implementation
String emitClass(ClassDefinition definition) {
final buffer = StringBuffer();
// Imports
buffer.writeln("import 'package:jsoncare_flutter/json_care.dart';");
final Set<String> importedClasses = {};
for (var field in definition.fields.values) {
if (field.nestedClassName != null &&
field.nestedClassName != definition.name &&
!importedClasses.contains(field.nestedClassName)) {
buffer.writeln(
"import '${ReCase(field.nestedClassName!).snakeCase}.dart';",
);
importedClasses.add(field.nestedClassName!);
}
}
buffer.writeln();
// Class definition
buffer.writeln("class ${definition.name} {");
// Fields
for (var field in definition.fields.values) {
final type = field.isList ? "List<${field.type}>" : field.type;
buffer.writeln(" final $type? ${field.name};");
}
buffer.writeln();
// Constructor
buffer.writeln(" ${definition.name}({");
for (var field in definition.fields.values) {
buffer.writeln(" this.${field.name},");
}
buffer.writeln(" });");
buffer.writeln();
// fromJson
buffer.writeln(
" factory ${definition.name}.fromJson(Map<String, dynamic> json) {",
);
buffer.writeln(" return ${definition.name}(");
definition.fields.forEach((key, field) {
final String careMethod;
String extraArgs = "";
if (field.isList) {
if (field.nestedClassName != null) {
careMethod = "list<${field.type}>";
extraArgs = ", (item) => ${field.type}.fromJson(JsonCare.map(item))";
} else {
// Primitive list
careMethod = "list<${field.type}>";
switch (field.type) {
case "int":
extraArgs = ", (item) => JsonCare.intVal(item)";
break;
case "double":
extraArgs = ", (item) => JsonCare.doubleVal(item)";
break;
case "bool":
extraArgs = ", (item) => JsonCare.boolVal(item)";
break;
case "String":
extraArgs = ", (item) => JsonCare.string(item)";
break;
case "DateTime":
extraArgs = ", (item) => JsonCare.dateVal(item)";
break;
default:
extraArgs = ", (item) => item";
break;
}
}
} else if (field.nestedClassName != null) {
careMethod = "map";
} else {
switch (field.type) {
case "int":
careMethod = "intVal";
break;
case "double":
careMethod = "doubleVal";
break;
case "bool":
careMethod = "boolVal";
break;
case "String":
careMethod = "string";
break;
case "DateTime":
careMethod = "dateVal";
break;
default:
careMethod = "map";
break;
}
}
if (field.nestedClassName != null && !field.isList) {
buffer.writeln(
" ${field.name}: json['${field.originalKey}'] != null ? ${field.type}.fromJson(JsonCare.map(json['${field.originalKey}'])) : null,",
);
} else {
buffer.writeln(
" ${field.name}: JsonCare.$careMethod(json['${field.originalKey}']$extraArgs),",
);
}
});
buffer.writeln(" );");
buffer.writeln(" }");
buffer.writeln();
// toJson
buffer.writeln(" Map<String, dynamic> toJson() {");
buffer.writeln(" return {");
definition.fields.forEach((key, field) {
if (field.nestedClassName != null) {
if (field.isList) {
buffer.writeln(
" '${field.originalKey}': ${field.name}?.map((item) => item.toJson()).toList(),",
);
} else {
buffer.writeln(
" '${field.originalKey}': ${field.name}?.toJson(),",
);
}
} else if (field.type == "DateTime") {
if (field.isList) {
buffer.writeln(
" '${field.originalKey}': ${field.name}?.map((item) => item.toIso8601String()).toList(),",
);
} else {
buffer.writeln(
" '${field.originalKey}': ${field.name}?.toIso8601String(),",
);
}
} else {
buffer.writeln(" '${field.originalKey}': ${field.name},");
}
});
buffer.writeln(" };");
buffer.writeln(" }");
buffer.writeln("}");
return buffer.toString();
}