generateModel static method

String generateModel(
  1. Model model
)

Implementation

static String generateModel(Model model) {
  var output = StringBuffer();

  output.writeln('// This file was generated by dart_openapi_model_gen');

  for (var dependency in model.dependencies) {
    final dependencyFilename = '${dependency.toSnakeCase()}.dart';
    output.writeln('import \'./$dependencyFilename\';\n\n');
  }

  output.writeln('class ${model.className()} {');
  output.writeln('  static const modelName = "${model.modelName}";\n');

  for (var property in model.properties) {
    final optionalMarker =
        property.isOptional && property.type != 'dynamic' ? '?' : '';
    output
        .writeln('  final ${property.type}$optionalMarker ${property.name};');
  }

  // Constructor with named parameters and default values
  output.writeln();
  output.write('  ${model.className()}({');
  for (var property in model.properties) {
    final requiredMarker = property.isRequired ? 'required ' : '';
    output.write('$requiredMarker this.${property.name}, ');
  }
  output.writeln('});\n');

  // copyWith method
  output.writeln('  ${model.className()} copyWith({');
  for (var property in model.properties) {
    // dynamic doesn't require optional, so for linting purposes
    final optionalMarker = property.type == 'dynamic' ? '' : '?';
    output.writeln('    ${property.type}$optionalMarker ${property.name},');
  }

  output.write('  }) => ${model.className()}(\n');
  for (var property in model.properties) {
    output.writeln(
        '        ${property.name}: ${property.name} ?? this.${property.name}, ');
  }
  output.writeln('  );\n');

  // toJson method
  output.writeln('  Map<String, dynamic> toJson() => {');
  for (var property in model.properties) {
    final optionalMarker = property.isOptional ? '?' : '';
    final toStringMarker = property.category == TypeCategory.enumeration
        ? '$optionalMarker.name'
        : '';
    output.writeln(
        '        \'${property.originalName}\': ${property.name}$toStringMarker,');
  }
  output.writeln('  };\n');

  // fromJson method
  output.write(
      '  factory ${model.className()}.fromJson(Map<String, dynamic> json) => ${model.className()}(\n');

  for (var property in model.properties) {
    output
        .writeln('        ${property.name}: ${propertyFromJson(property)},');
  }
  output.writeln('  );');

  // Close class
  output.writeln('}');

  return output.toString();
}