buildMutate method
Future<void>
buildMutate(
- ClassDeclaration clazz,
- 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 ")}
);
""")));
}
}