@@ -53,8 +53,9 @@ import GraphQL.Value
53
53
, FromValue (.. )
54
54
, ToValue (.. )
55
55
)
56
- import GraphQL.Internal.Name (Name , HasName (.. ))
56
+ import GraphQL.Internal.Name (Name , HasName (.. ), unName )
57
57
import qualified GraphQL.Internal.OrderedMap as OrderedMap
58
+ import GraphQL.Internal.Schema (ObjectTypeDefinition (.. ))
58
59
import GraphQL.Internal.Output (GraphQLError (.. ))
59
60
import GraphQL.Internal.Validation
60
61
( SelectionSetByType
@@ -212,9 +213,16 @@ type family FieldName (a :: Type) = (r :: Symbol) where
212
213
FieldName x = TypeError ('Text " Unexpected branch in FieldName type family. Please file a bug!" ':<>: 'ShowType x )
213
214
214
215
resolveField :: forall dispatchType (m :: Type -> Type ).
215
- (BuildFieldResolver m dispatchType , Monad m , KnownSymbol (FieldName dispatchType ))
216
- => FieldHandler m dispatchType -> m ResolveFieldResult -> Field Value -> m ResolveFieldResult
217
- resolveField handler nextHandler field =
216
+ ( BuildFieldResolver m dispatchType
217
+ , Monad m
218
+ , KnownSymbol (FieldName dispatchType )
219
+ )
220
+ => FieldHandler m dispatchType
221
+ -> m ResolveFieldResult
222
+ -> ObjectTypeDefinition
223
+ -> Field Value
224
+ -> m ResolveFieldResult
225
+ resolveField handler nextHandler defn field =
218
226
-- check name before
219
227
case API. nameFromSymbol @ (FieldName dispatchType ) of
220
228
Left err -> pure (Result [SchemaError err] (Just GValue. ValueNull ))
@@ -225,6 +233,8 @@ resolveField handler nextHandler field =
225
233
Right resolver -> do
226
234
Result errs value <- resolver
227
235
pure (Result errs (Just value))
236
+ | getName field == " __typename" ->
237
+ pure $ Result [] (Just $ GValue. ValueString $ GValue. String $ unName $ getName defn)
228
238
| otherwise -> nextHandler
229
239
230
240
-- We're using our usual trick of rewriting a type in a closed type
@@ -312,7 +322,6 @@ type family RunFieldsHandler (m :: Type -> Type) (a :: Type) = (r :: Type) where
312
322
RunFieldsHandler m a = TypeError (
313
323
'Text " Unexpected RunFieldsHandler types: " ':<>: 'ShowType a )
314
324
315
-
316
325
class RunFields m a where
317
326
-- | Run a single 'Selection' over all possible fields (as specified by the
318
327
-- type @a@), returning exactly one 'GValue.ObjectField' when a field
@@ -321,7 +330,7 @@ class RunFields m a where
321
330
-- Individual implementations are responsible for calling 'runFields' if
322
331
-- they haven't matched the field and there are still candidate fields
323
332
-- within the handler.
324
- runFields :: RunFieldsHandler m a -> Field Value -> m ResolveFieldResult
333
+ runFields :: RunFieldsHandler m a -> ObjectTypeDefinition -> Field Value -> m ResolveFieldResult
325
334
326
335
instance forall f fs m dispatchType .
327
336
( BuildFieldResolver m dispatchType
@@ -330,19 +339,19 @@ instance forall f fs m dispatchType.
330
339
, KnownSymbol (FieldName dispatchType )
331
340
, Monad m
332
341
) => RunFields m (f :<> fs ) where
333
- runFields (handler :<> nextHandlers) field =
334
- resolveField @ dispatchType @ m handler nextHandler field
342
+ runFields (handler :<> nextHandlers) defn field =
343
+ resolveField @ dispatchType @ m handler nextHandler defn field
335
344
where
336
- nextHandler = runFields @ m @ fs nextHandlers field
345
+ nextHandler = runFields @ m @ fs nextHandlers defn field
337
346
338
347
instance forall ksM t m dispatchType .
339
348
( BuildFieldResolver m dispatchType
340
349
, KnownSymbol ksM
341
350
, dispatchType ~ FieldResolverDispatchType (API. Field ksM t )
342
351
, Monad m
343
352
) => RunFields m (API. Field ksM t ) where
344
- runFields handler field =
345
- resolveField @ dispatchType @ m handler nextHandler field
353
+ runFields handler defn field =
354
+ resolveField @ dispatchType @ m handler nextHandler defn field
346
355
where
347
356
nextHandler = pure (Result [FieldNotFoundError (getName field)] Nothing )
348
357
@@ -352,8 +361,8 @@ instance forall m a b dispatchType.
352
361
, KnownSymbol (FieldName dispatchType )
353
362
, Monad m
354
363
) => RunFields m (a :> b ) where
355
- runFields handler field =
356
- resolveField @ dispatchType @ m handler nextHandler field
364
+ runFields handler defn field =
365
+ resolveField @ dispatchType @ m handler nextHandler defn field
357
366
where
358
367
nextHandler = pure (Result [FieldNotFoundError (getName field)] Nothing )
359
368
@@ -368,12 +377,12 @@ instance forall typeName interfaces fields m.
368
377
resolve mHandler (Just selectionSet) =
369
378
case getSelectionSet of
370
379
Left err -> throwE err
371
- Right ss -> do
380
+ Right (ss, defn) -> do
372
381
-- Run the handler so the field resolvers have access to the object.
373
382
-- This (and other places, including field resolvers) is where user
374
383
-- code can do things like look up something in a database.
375
384
handler <- mHandler
376
- r <- traverse (runFields @ m @ (RunFieldsType m fields ) handler) ss
385
+ r <- traverse (runFields @ m @ (RunFieldsType m fields ) handler defn ) ss
377
386
let (Result errs obj) = GValue. objectFromOrderedMap . OrderedMap. catMaybes <$> sequenceA r
378
387
pure (Result errs (GValue. ValueObject obj))
379
388
@@ -391,7 +400,7 @@ instance forall typeName interfaces fields m.
391
400
-- See <https://facebook.github.io/graphql/#sec-Field-Collection> for
392
401
-- more details.
393
402
(SelectionSet ss') <- first ValidationError $ getSelectionSetForType defn selectionSet
394
- pure ss'
403
+ pure ( ss', defn)
395
404
396
405
-- TODO(tom): we're getting to a point where it might make sense to
397
406
-- split resolver into submodules (GraphQL.Resolver.Union etc.)
0 commit comments