Skip to content

Commit 2255e9a

Browse files
authored
Merge pull request #339 from mickhansen/ResolveFieldContext-Path
add Path to ResolveFieldContext
2 parents 18d3a83 + 962423b commit 2255e9a

2 files changed

Lines changed: 13 additions & 7 deletions

File tree

src/FSharp.Data.GraphQL.Server/Execution.fs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ let private resolveUnionType possibleTypesFn (uniondef: UnionDef) =
224224
| Some resolveType -> resolveType
225225
| None -> defaultResolveType possibleTypesFn uniondef
226226

227-
let private createFieldContext objdef argDefs ctx (info: ExecutionInfo) =
227+
let private createFieldContext objdef argDefs ctx (info: ExecutionInfo) (path : obj list) =
228228
let fdef = info.Definition
229229
let args = getArgumentValues argDefs info.Ast.Arguments ctx.Variables
230230
{ ExecutionInfo = info
@@ -233,7 +233,8 @@ let private createFieldContext objdef argDefs ctx (info: ExecutionInfo) =
233233
ParentType = objdef
234234
Schema = ctx.Schema
235235
Args = args
236-
Variables = ctx.Variables }
236+
Variables = ctx.Variables
237+
Path = path |> List.rev }
237238

238239
let private resolveField (execute: ExecuteField) (ctx: ResolveFieldContext) (parentValue: obj) =
239240
if ctx.ExecutionInfo.IsNullable
@@ -515,8 +516,8 @@ and executeObjectFields (fields : ExecutionInfo list) (objName : string) (objDef
515516
let executeField field =
516517
let argDefs = ctx.Context.FieldExecuteMap.GetArgs(objDef.Name, field.Definition.Name)
517518
let resolver = ctx.Context.FieldExecuteMap.GetExecute(objDef.Name, field.Definition.Name)
518-
let fieldCtx = createFieldContext objDef argDefs ctx field
519519
let fieldPath = (field.Identifier :> obj :: path)
520+
let fieldCtx = createFieldContext objDef argDefs ctx field fieldPath
520521
executeResolvers fieldCtx fieldPath value (resolveField resolver fieldCtx value)
521522
let! res =
522523
fields
@@ -572,7 +573,8 @@ let private executeQueryOrMutation (resultSet: (string * ExecutionInfo) []) (ctx
572573
ParentType = objdef
573574
Schema = ctx.Schema
574575
Args = args
575-
Variables = ctx.Variables }
576+
Variables = ctx.Variables
577+
Path = path |> List.rev }
576578
let execute = ctx.FieldExecuteMap.GetExecute(ctx.ExecutionPlan.RootDef.Name, info.Definition.Name)
577579
asyncVal {
578580
let! result =
@@ -597,16 +599,18 @@ let private executeSubscription (resultSet: (string * ExecutionInfo) []) (ctx: E
597599
let subdef = info.Definition :?> SubscriptionFieldDef
598600
let args = getArgumentValues subdef.Args info.Ast.Arguments ctx.Variables
599601
let returnType = subdef.OutputTypeDef
602+
let fieldPath = [ info.Identifier :> obj ]
600603
let fieldCtx =
601604
{ ExecutionInfo = info
602605
Context = ctx
603606
ReturnType = returnType
604607
ParentType = objdef
605608
Schema = ctx.Schema
606609
Args = args
607-
Variables = ctx.Variables }
610+
Variables = ctx.Variables
611+
Path = fieldPath |> List.rev }
608612
let onValue v = asyncVal {
609-
match! executeResolvers fieldCtx [ info.Identifier ] value (toOption v |> AsyncVal.wrap) with
613+
match! executeResolvers fieldCtx fieldPath value (toOption v |> AsyncVal.wrap) with
610614
| Ok (data, None, []) -> return NameValueLookup.ofList["data", box <| NameValueLookup.ofList [nameOrAlias, data.Value]] :> Output
611615
| Ok (data, None, errs) -> return NameValueLookup.ofList["data", box <| NameValueLookup.ofList [nameOrAlias, data.Value]; "errors", upcast errs] :> Output
612616
| Ok (_, Some _, _) -> return failwithf "Deferred/Streamed/Live are not supported for subscriptions!"

src/FSharp.Data.GraphQL.Shared/TypeSystem.fs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -878,7 +878,9 @@ and ResolveFieldContext =
878878
/// parametrized inputs.
879879
Args : Map<string, obj>
880880
/// Variables provided by the operation caller.
881-
Variables : Map<string, obj> }
881+
Variables : Map<string, obj>
882+
/// Field path
883+
Path : obj list }
882884

883885
/// Remembers an exception, so it can be included in the final response.
884886
member x.AddError(error : exn) = x.Context.Errors.Add error

0 commit comments

Comments
 (0)