generateArgumentClassSpec function

Spec generateArgumentClassSpec(
  1. QueryDefinition definition
)

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