Skip to content

Commit 552a3d1

Browse files
pkesexperiandri
authored andcommitted
Add support for generic IDictionary<string,obj> query inputs
1 parent 5db0bfa commit 552a3d1

File tree

1 file changed

+24
-4
lines changed

1 file changed

+24
-4
lines changed

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

+24-4
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,30 @@ let rec internal compileByType (inputObjectPath: FieldPath) (inputSource : Input
8989

9090
| InputObject objDef ->
9191
let objtype = objDef.Type
92-
let ctor = ReflectionHelper.matchConstructor objtype (objDef.Fields |> Array.map (fun x -> x.Name))
92+
let (constructor : obj[] -> obj), (parameterInfos : Reflection.ParameterInfo[]) =
93+
if typeof<IDictionary<string,obj>>.IsAssignableFrom(objtype) then
94+
let parameterInfos = [|
95+
for f in objDef.Fields ->
96+
{ new Reflection.ParameterInfo() with
97+
member _.Name = f.Name
98+
member _.ParameterType = f.TypeDef.Type
99+
member _.Attributes = Reflection.ParameterAttributes.Optional
100+
}
101+
|]
102+
let constructor (args:obj[]) =
103+
let o = Activator.CreateInstance(objtype)
104+
let dict = o :?> IDictionary<string, obj>
105+
for fld,arg in Seq.zip objDef.Fields args do
106+
dict.Add(fld.Name, arg)
107+
box o
108+
constructor, parameterInfos
109+
else
110+
let ctor = ReflectionHelper.matchConstructor objtype (objDef.Fields |> Array.map (fun x -> x.Name))
111+
ctor.Invoke, ctor.GetParameters()
112+
93113

94114
let struct (mapper, nullableMismatchParameters, missingParameters) =
95-
ctor.GetParameters ()
115+
parameterInfos
96116
|> Array.fold (
97117
fun
98118
struct(all: ResizeArray<_>, areNullable: HashSet<_>, missing: HashSet<_>)
@@ -170,7 +190,7 @@ let rec internal compileByType (inputObjectPath: FieldPath) (inputSource : Input
170190

171191
let! args = argResults |> splitSeqErrorsList
172192

173-
let instance = ctor.Invoke args
193+
let instance = constructor args
174194
do! objDef.Validator instance
175195
|> ValidationResult.mapErrors (fun err -> err |> mapInputObjectError inputSource inputObjectPath originalInputDef)
176196
return instance
@@ -197,7 +217,7 @@ let rec internal compileByType (inputObjectPath: FieldPath) (inputSource : Input
197217

198218
let! args = argResults |> splitSeqErrorsList
199219

200-
let instance = ctor.Invoke args
220+
let instance = constructor args
201221
do! objDef.Validator instance
202222
|> ValidationResult.mapErrors (fun err -> err |> mapInputObjectError inputSource inputObjectPath originalInputDef)
203223
return instance

0 commit comments

Comments
 (0)