generate method
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;
}