generateArgumentClassSpec function
Generates a Spec of a mutation argument class.
Implementation
Spec generateArgumentClassSpec(QueryDefinition definition) {
final fromJsonCtor = Constructor(
(b) => b
..factory = true
..name = 'fromJson'
..lambda = true
..requiredParameters.add(
Parameter(
(p) => p
..type = refer('Map<String, dynamic>')
..name = 'json',
),
)
// Keep annotation only when not using GraphQLDataClass for backward compatibility
..annotations.addAll([const CodeExpression(Code('override'))])
..body = Code('_\$${definition.className}ArgumentsFromJson(json)'),
);
final classBuilder = ClassBuilder()
..annotations.add(
const CodeExpression(Code('JsonSerializable(explicitToJson: true)')),
)
..name = '${definition.className}Arguments'
..extend = refer('JsonSerializable')
..constructors.add(
Constructor(
(b) => b
..optionalParameters.addAll(
definition.inputs.map(
(input) => Parameter(
(p) => p
..name = input.name.namePrintable
..named = true
..toThis = true
..required = input.type.isNonNull,
),
),
),
),
)
..constructors.add(fromJsonCtor)
..fields.addAll(
definition.inputs.map(
(p) => Field((f) {
f
..name = p.name.namePrintable
..late = p.type.isNonNull
..type = refer(p.type.namePrintable)
..annotations.addAll(
p.annotations.map((e) => CodeExpression(Code(e))),
);
if (!p.type.isNonNull) {
f.modifier = FieldModifier.final$;
}
}),
),
)
..mixins.add(refer('EquatableMixin'))
..methods.add(
_propsMethod(definition.inputs.map((input) => input.name.namePrintable)),
)
..methods.add(
Method(
(m) => m
..name = 'toJson'
..lambda = true
..returns = refer('Map<String, dynamic>')
..annotations.add(const CodeExpression(Code('override')))
..body = Code('_\$${definition.className}ArgumentsToJson(this)'),
),
);
return classBuilder.build();
}