@@ -53,8 +53,9 @@ import GraphQL.Value
5353 , FromValue (.. )
5454 , ToValue (.. )
5555 )
56- import GraphQL.Internal.Name (Name , HasName (.. ))
56+ import GraphQL.Internal.Name (Name , HasName (.. ), unName )
5757import qualified GraphQL.Internal.OrderedMap as OrderedMap
58+ import GraphQL.Internal.Schema (ObjectTypeDefinition (.. ))
5859import GraphQL.Internal.Output (GraphQLError (.. ))
5960import GraphQL.Internal.Validation
6061 ( SelectionSetByType
@@ -212,9 +213,16 @@ type family FieldName (a :: Type) = (r :: Symbol) where
212213 FieldName x = TypeError ('Text " Unexpected branch in FieldName type family. Please file a bug!" ':<>: 'ShowType x )
213214
214215resolveField :: 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 =
218226 -- check name before
219227 case API. nameFromSymbol @ (FieldName dispatchType ) of
220228 Left err -> pure (Result [SchemaError err] (Just GValue. ValueNull ))
@@ -225,6 +233,8 @@ resolveField handler nextHandler field =
225233 Right resolver -> do
226234 Result errs value <- resolver
227235 pure (Result errs (Just value))
236+ | getName field == " __typename" ->
237+ pure $ Result [] (Just $ GValue. ValueString $ GValue. String $ unName $ getName defn)
228238 | otherwise -> nextHandler
229239
230240-- 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
312322 RunFieldsHandler m a = TypeError (
313323 'Text " Unexpected RunFieldsHandler types: " ':<>: 'ShowType a )
314324
315-
316325class RunFields m a where
317326 -- | Run a single 'Selection' over all possible fields (as specified by the
318327 -- type @a@), returning exactly one 'GValue.ObjectField' when a field
@@ -321,7 +330,7 @@ class RunFields m a where
321330 -- Individual implementations are responsible for calling 'runFields' if
322331 -- they haven't matched the field and there are still candidate fields
323332 -- within the handler.
324- runFields :: RunFieldsHandler m a -> Field Value -> m ResolveFieldResult
333+ runFields :: RunFieldsHandler m a -> ObjectTypeDefinition -> Field Value -> m ResolveFieldResult
325334
326335instance forall f fs m dispatchType .
327336 ( BuildFieldResolver m dispatchType
@@ -330,19 +339,19 @@ instance forall f fs m dispatchType.
330339 , KnownSymbol (FieldName dispatchType )
331340 , Monad m
332341 ) => 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
335344 where
336- nextHandler = runFields @ m @ fs nextHandlers field
345+ nextHandler = runFields @ m @ fs nextHandlers defn field
337346
338347instance forall ksM t m dispatchType .
339348 ( BuildFieldResolver m dispatchType
340349 , KnownSymbol ksM
341350 , dispatchType ~ FieldResolverDispatchType (API. Field ksM t )
342351 , Monad m
343352 ) => 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
346355 where
347356 nextHandler = pure (Result [FieldNotFoundError (getName field)] Nothing )
348357
@@ -352,8 +361,8 @@ instance forall m a b dispatchType.
352361 , KnownSymbol (FieldName dispatchType )
353362 , Monad m
354363 ) => 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
357366 where
358367 nextHandler = pure (Result [FieldNotFoundError (getName field)] Nothing )
359368
@@ -368,12 +377,12 @@ instance forall typeName interfaces fields m.
368377 resolve mHandler (Just selectionSet) =
369378 case getSelectionSet of
370379 Left err -> throwE err
371- Right ss -> do
380+ Right (ss, defn) -> do
372381 -- Run the handler so the field resolvers have access to the object.
373382 -- This (and other places, including field resolvers) is where user
374383 -- code can do things like look up something in a database.
375384 handler <- mHandler
376- r <- traverse (runFields @ m @ (RunFieldsType m fields ) handler) ss
385+ r <- traverse (runFields @ m @ (RunFieldsType m fields ) handler defn ) ss
377386 let (Result errs obj) = GValue. objectFromOrderedMap . OrderedMap. catMaybes <$> sequenceA r
378387 pure (Result errs (GValue. ValueObject obj))
379388
@@ -391,7 +400,7 @@ instance forall typeName interfaces fields m.
391400 -- See <https://facebook.github.io/graphql/#sec-Field-Collection> for
392401 -- more details.
393402 (SelectionSet ss') <- first ValidationError $ getSelectionSetForType defn selectionSet
394- pure ss'
403+ pure ( ss', defn)
395404
396405-- TODO(tom): we're getting to a point where it might make sense to
397406-- split resolver into submodules (GraphQL.Resolver.Union etc.)
0 commit comments