diff --git a/codegen/gql_code_builder/lib/serializer.dart b/codegen/gql_code_builder/lib/serializer.dart index 12cc076d..cadb2432 100644 --- a/codegen/gql_code_builder/lib/serializer.dart +++ b/codegen/gql_code_builder/lib/serializer.dart @@ -1,42 +1,39 @@ import "package:analyzer/dart/element/element.dart"; import "package:code_builder/code_builder.dart"; -Expression withCustomSerializers( - Expression serializersExpression, - Set customSerializers, -) => - customSerializers.fold( - serializersExpression, - (exp, serializer) => exp.cascade("add").call([serializer]), - ); - Library buildSerializerLibrary( Set builtClasses, String partDirectiveUrl, - Set additionalSerializers, -) => + Set additionalSerializers, { + Expression? externalSerializers, +}) => Library( (b) => b ..directives.add(Directive.part(partDirectiveUrl)) ..body.addAll([ - withCustomSerializers( - declareFinal( - "_serializersBuilder", - type: refer( - "SerializersBuilder", "package:built_value/serializer.dart"), - ) - .assign( - refer(r"_$serializers"), - ) - .property("toBuilder") - .call([]), - additionalSerializers, - ).cascade("addPlugin").call([ - refer( - "StandardJsonPlugin", - "package:built_value/standard_json_plugin.dart", - ).call([]) - ]).statement, + declareFinal( + "_serializersBuilder", + type: refer( + "SerializersBuilder", "package:built_value/serializer.dart"), + ) + .assign( + refer(r"_$serializers"), + ) + .property("toBuilder") + .call([]) + .withCustomSerializers(additionalSerializers) + .applyIf( + externalSerializers != null, + (expr) => expr.cascade("addAll").call([externalSerializers!]), + ) + .cascade("addPlugin") + .call([ + refer( + "StandardJsonPlugin", + "package:built_value/standard_json_plugin.dart", + ).call([]) + ]) + .statement, refer("@SerializersFor", "package:built_value/serializer.dart").call([ literalList( builtClasses @@ -55,3 +52,19 @@ Library buildSerializerLibrary( .call([]).statement, ]), ); + +extension on Expression { + Expression applyIf( + bool condition, + Expression Function(Expression) wrap, + ) => + condition ? wrap(this) : this; + + Expression withCustomSerializers( + Set customSerializers, + ) => + customSerializers.fold( + this, + (exp, serializer) => exp.cascade("add").call([serializer]), + ); +} diff --git a/codegen/gql_code_builder/pubspec.yaml b/codegen/gql_code_builder/pubspec.yaml index 27f683c0..f4c68b61 100644 --- a/codegen/gql_code_builder/pubspec.yaml +++ b/codegen/gql_code_builder/pubspec.yaml @@ -1,5 +1,5 @@ name: gql_code_builder -version: 0.12.0 +version: 0.13.0 description: Dart code builders taking *.graphql documents and SDL to build useful classes. repository: https://github.com/gql-dart/gql environment: