emitClass method

String emitClass(
  1. ClassDefinition definition
)

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