@@ -13,8 +13,20 @@ public final class Type<Resolver, Context, ObjectType: Encodable>: TypeComponent
1313 }
1414
1515 override func update( typeProvider: SchemaTypeProvider , coders: Coders ) throws {
16- var fieldDefs = try fields ( typeProvider: typeProvider, coders: coders)
16+ let fieldDefs = try fields ( typeProvider: typeProvider, coders: coders)
17+ let objectType = try GraphQLObjectType (
18+ name: name,
19+ description: description,
20+ fields: fieldDefs,
21+ interfaces: interfaces. map {
22+ try typeProvider. getInterfaceType ( from: $0)
23+ } ,
24+ isTypeOf: isTypeOf
25+ )
1726
27+ try typeProvider. add ( type: ObjectType . self, as: objectType)
28+
29+ // If federation keys are included, validate and create resolver closure
1830 if !keys. isEmpty {
1931 let fieldNames = Array ( fieldDefs. keys)
2032 for key in keys {
@@ -25,58 +37,39 @@ public final class Type<Resolver, Context, ObjectType: Encodable>: TypeComponent
2537 )
2638 }
2739
28- fieldDefs [ resolveReferenceFieldName] = GraphQLField (
29- type: GraphQLNonNull ( GraphQLTypeReference ( name) ) , // Self-referential
30- description: " Return the entity of this object type that matches the provided representation. Used by Query._entities. " ,
31- args: [
32- " representations " : GraphQLArgument ( type: GraphQLList ( anyType) )
33- ] ,
34- resolve: { source, args, context, eventLoopGroup, info in
35- guard let s = source as? Resolver else {
36- throw GraphQLError (
37- message: " Expected source type \( ObjectType . self) but got \( type ( of: source) ) "
38- )
39- }
40-
41- guard let c = context as? Context else {
42- throw GraphQLError (
43- message: " Expected context type \( Context . self) but got \( type ( of: context) ) "
44- )
45- }
46-
47- let keyMatch = self . keys. first { key in
48- key. mapMatchesArguments ( args, coders: coders)
49- }
50- guard let key = keyMatch else {
51- throw GraphQLError (
52- message: " No matching key was found for representation \( args) . "
53- )
54- }
55-
56- return try key. resolveMap (
57- resolver: s,
58- context: c,
59- map: args,
60- eventLoopGroup: eventLoopGroup,
61- coders: coders
40+ let resolve : GraphQLFieldResolve = { source, args, context, eventLoopGroup, info in
41+ guard let s = source as? Resolver else {
42+ throw GraphQLError (
43+ message: " Expected source type \( ObjectType . self) but got \( type ( of: source) ) "
6244 )
6345 }
64- )
65- }
66-
67- let objectType = try GraphQLObjectType (
68- name: name,
69- description: description,
70- fields: fieldDefs,
71- interfaces: interfaces. map {
72- try typeProvider. getInterfaceType ( from: $0)
73- } ,
74- isTypeOf: isTypeOf
75- )
7646
77- try typeProvider. add ( type: ObjectType . self, as: objectType)
78- if !keys. isEmpty {
47+ guard let c = context as? Context else {
48+ throw GraphQLError (
49+ message: " Expected context type \( Context . self) but got \( type ( of: context) ) "
50+ )
51+ }
52+
53+ let keyMatch = self . keys. first { key in
54+ key. mapMatchesArguments ( args, coders: coders)
55+ }
56+ guard let key = keyMatch else {
57+ throw GraphQLError (
58+ message: " No matching key was found for representation \( args) . "
59+ )
60+ }
61+
62+ return try key. resolveMap (
63+ resolver: s,
64+ context: c,
65+ map: args,
66+ eventLoopGroup: eventLoopGroup,
67+ coders: coders
68+ )
69+ }
70+
7971 typeProvider. federatedTypes. append ( objectType)
72+ typeProvider. federatedResolvers [ name] = resolve
8073 }
8174 }
8275
0 commit comments