buildMutate method

Future<void> buildMutate(
  1. ClassDeclaration clazz,
  2. MemberDeclarationBuilder builder
)

Implementation

Future<void> buildMutate(ClassDeclaration clazz,
    MemberDeclarationBuilder builder) async {
  List<FieldDeclaration> properties = await validFields(clazz, builder);
  if(properties.isEmpty){
    builder.declareInType(DeclarationCode.fromString(asCode("""
  /// Creates a new [${clazz.identifier.name}] object with the provided fields as overrides
  /// Also provides mutator methods to add,remove,removeWhere on Lists, Sets & Maps
  ${clazz.identifier.name} mutate() => ${clazz.identifier.name}();
  """)));

  }else{
    builder.declareInType(DeclarationCode.fromString(asCode("""
  /// Creates a new [${clazz.identifier.name}] object with the provided fields as overrides
  /// Also provides mutator methods to add,remove,removeWhere on Lists, Sets & Maps
  ${properties.map((i) {
      String s =  "/// ### [${i.identifier.name.substring(1)}]";

      if(i.type.name == "List"){
        s += "\n    /// * add [add${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}]";
        s += "\n    /// * remove [remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}]";
        s += "\n    /// * removeWhere [remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}Where]";
      } else if(i.type.name == "Set") {
        s += "\n    /// * add [add${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}]";
        s += "\n    /// * remove [remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}]";
        s += "\n    /// * removeWhere [remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}Where]";
      } else if(i.type.name == "Map") {
        s += "\n    /// * add [add${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}]";
        s += "\n    /// * removeKeys [remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}Keys]";
        s += "\n    /// * removeKeysWhere [remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}KeysWhere]";
        s += "\n    /// * removeValues [remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}Values]";
        s += "\n    /// * removeValuesWhere [remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}ValuesWhere]";
      }

      return s;
    }).join("\n    ")}
  ${clazz.identifier.name} mutate({
    ${properties.map((i) => "${i.type.fullName}? ${i.identifier.name.substring(1)}")

        .followedBy(properties.where((i) => i.type.name == "List" || i.type.name == "Set").map((i) => "Iterable<${(i.type as NamedTypeAnnotation).typeArguments.first.fullName}>? add${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}"))
        .followedBy(properties.where((i) => i.type.name == "List" || i.type.name == "Set").map((i) => "Iterable<${(i.type as NamedTypeAnnotation).typeArguments.first.fullName}>? remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}"))
        .followedBy(properties.where((i) => i.type.name == "List" || i.type.name == "Set").map((i) => "bool Function(${(i.type as NamedTypeAnnotation).typeArguments.first.fullName})? remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}Where"))
        .followedBy(properties.where((i) => i.type.name == "Map").map((i) => "${i.type.fullName}? add${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}"))
        .followedBy(properties.where((i) => i.type.name == "Map").map((i) => "Iterable<${(i.type as NamedTypeAnnotation).typeArguments.first.fullName}>? remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}Keys"))
        .followedBy(properties.where((i) => i.type.name == "Map").map((i) => "bool Function(${(i.type as NamedTypeAnnotation).typeArguments.first.fullName})? remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}KeysWhere"))
        .followedBy(properties.where((i) => i.type.name == "Map").map((i) => "Iterable<${(i.type as NamedTypeAnnotation).typeArguments.last.fullName}>? remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}Values"))
        .followedBy(properties.where((i) => i.type.name == "Map").map((i) => "bool Function(${(i.type as NamedTypeAnnotation).typeArguments.last.fullName})? remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}ValuesWhere"))

        .join(",\n      ")}
  }) => ${clazz.identifier.name}(
      ${properties.map((i) {
      String s = "${i.identifier.name.substring(1)} ?? this.${i.identifier.name.substring(1)}";

      if(i.type.name == "List"){
        s = "Model.modList<${(i.type as NamedTypeAnnotation).typeArguments.first.fullName}>($s, add${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}, remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}, remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}Where)";
      } else if(i.type.name == "Set") {
        s = "Model.modSet<${(i.type as NamedTypeAnnotation).typeArguments.first.fullName}>($s, add${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}, remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}, remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}Where)";
      } else if(i.type.name == "Map") {
        s = "Model.modMap<${(i.type as NamedTypeAnnotation).typeArguments.first.fullName}, ${(i.type as NamedTypeAnnotation).typeArguments.last.fullName}>($s, add${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}, remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}Keys, remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}KeysWhere, remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}Values, remove${i.identifier.name.substring(1,2).toUpperCase()}${i.identifier.name.substring(2)}ValuesWhere)";
      }

      return "${i.identifier.name.substring(1)}: $s";
    })
        .join(",\n        ")}
  );
  """)));
  }
}