generate method

String generate(
  1. GraphQLObjectType objectType
)

Generate a complete entity file for objectType.

Implementation

String generate(GraphQLObjectType objectType) {
  final className = '\$${objectType.name}';

  final library = cb.Library((b) {
    // Build fields
    final fields = <cb.Field>[];
    final constructorParams = <cb.Parameter>[];
    final fromJsonBody = <cb.Code>[];
    final toJsonEntries = <Object?, Object?>{};

    for (final field in objectType.fields) {
      if (field.isDeprecated) continue;

      final fieldName = TypeMapper.fieldName(field.name);
      final dartType = zorphyType(typeMapper, field.type);
      final isNullable = !field.type.isNonNull;

      // Field declaration
      fields.add(
        cb.Field((f) {
          f
            ..name = fieldName
            ..modifier = cb.FieldModifier.final$
            ..type = cb.refer(dartType);
        }),
      );

      // Constructor parameter
      constructorParams.add(
        cb.Parameter((p) {
          p
            ..name = fieldName
            ..named = true
            ..required = !isNullable
            ..toThis = true;
        }),
      );

      // fromJson parsing
      final jsonAccess = 'json[\'${field.name}\']';
      if (isListType(field.type)) {
        final elementType = listElementType(field.type);
        final isElementNullable = !isNonNullTop(elementType);
        // `as List<dynamic>` throws on null for non-null fields; nullable
        // fields cast to `List<dynamic>?` and guard with `?.`.
        final listCast = 'as List<dynamic>${isNullable ? '?' : ''}';
        final nullSafeMap = isNullable ? '?.' : '.';

        fromJsonBody.add(
          cb.Code(
            '$fieldName: ($jsonAccess $listCast)$nullSafeMap'
            'map((e) => ${_parseJsonExpression(elementType, 'e', isElementNullable)})'
            '.toList(),',
          ),
        );
      } else {
        fromJsonBody.add(
          cb.Code(
            '$fieldName: ${_parseJsonExpression(field.type, jsonAccess, isNullable)},',
          ),
        );
      }

      // toJson entry
      toJsonEntries[cb.literalString(field.name)] = _toJsonExpression(
        fieldName,
        field.type,
      );
    }

    // Class
    b.body.add(
      cb.Class((c) {
        c
          ..name = className
          ..constructors.add(
            cb.Constructor((ctor) {
              ctor.constant = true;
              ctor.optionalParameters.addAll(constructorParams);
            }),
          );

        c.fields.addAll(fields);

        // fromJson
        if (includeFromJson) {
          c.methods.add(
            cb.Method((m) {
              m
                ..name = 'fromJson'
                ..returns = cb.refer(className)
                ..static = true
                ..requiredParameters.add(
                  cb.Parameter((p) {
                    p
                      ..name = 'json'
                      ..type = cb.refer('Map<String, dynamic>');
                  }),
                )
                ..body = cb.Block((bl) {
                  bl.statements.add(cb.Code('return $className('));
                  for (final code in fromJsonBody) {
                    bl.statements.add(code);
                  }
                  bl.statements.add(cb.Code(');'));
                });
            }),
          );
        }

        // toJson
        if (includeToJson) {
          c.methods.add(
            cb.Method((m) {
              m
                ..name = 'toJson'
                ..returns = cb.refer('Map<String, dynamic>')
                ..body = cb.literalMap(toJsonEntries).returned.statement;
            }),
          );
        }

        // copyWith (optional but useful)
        c.methods.add(_buildCopyWith(className, objectType.fields));
      }),
    );
  });

  final emitter = cb.DartEmitter();
  final raw = library.accept(emitter).toString();
  var formatted = raw;
  try {
    formatted = _formatter.format(raw);
  } on FormatterException {
    // Fallback: unformatted code is better than a crash.
  }
  return formatted;
}