From 0eb74ac50e5eec384a78692b133914892db415dc Mon Sep 17 00:00:00 2001 From: Tuomas Hietanen Date: Wed, 29 Oct 2025 10:31:19 +0000 Subject: [PATCH 1/3] Added type information to error matching --- src/FSharp.Data.GraphQL.Server/Values.fs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/FSharp.Data.GraphQL.Server/Values.fs b/src/FSharp.Data.GraphQL.Server/Values.fs index e7fd7e5d..d7aa2ad6 100644 --- a/src/FSharp.Data.GraphQL.Server/Values.fs +++ b/src/FSharp.Data.GraphQL.Server/Values.fs @@ -141,8 +141,10 @@ let rec internal compileByType if ReflectionHelper.isAssignableWithUnwrap inputType paramType then allParameters.Add (struct (ValueSome field, param)) else - // TODO: Consider improving by specifying type mismatches - typeMismatchParameters.Add param.Name |> ignore + let expectedType = inputDef.Type.ToString () + let actualType = paramType.ToString () + typeMismatchParameters.Add (param.Name, expectedType, actualType) + |> ignore | None -> if ReflectionHelper.isParameterSkippable param @@ -172,10 +174,20 @@ let rec internal compileByType $"Input object %s{objDef.Name} refers to type '%O{objType}', but skippable '%s{``params``}' GraphQL fields and constructor parameters do not match" InvalidInputTypeException (message, skippableMismatchParameters.ToImmutableHashSet ()) if typeMismatchParameters.Any () then + + let typeMismatchParameterNames = HashSet () + + let details = + typeMismatchParameters + |> Seq.map (fun (name, expected, actual) -> + typeMismatchParameterNames.Add name |> ignore + sprintf "Parameter '%s': expected %s, got %s" name expected actual) + |> String.concat "; " + let message = let ``params`` = String.Join ("', '", typeMismatchParameters) - $"Input object %s{objDef.Name} refers to type '%O{objType}', but GraphQL fields '%s{``params``}' have different types than constructor parameters" - InvalidInputTypeException (message, typeMismatchParameters.ToImmutableHashSet ()) + $"Input object %s{objDef.Name} refers to type '%O{objType}', but GraphQL fields '%s{``params``}' have different types than constructor parameters: {details}" + InvalidInputTypeException (message, typeMismatchParameterNames.ToImmutableHashSet ()) ] match exceptions with | [] -> () From bd22c1fb412cd07ac29a8150833ad587c04aef99 Mon Sep 17 00:00:00 2001 From: Tuomas Hietanen Date: Thu, 30 Oct 2025 11:41:39 +0000 Subject: [PATCH 2/3] Update src/FSharp.Data.GraphQL.Server/Values.fs Co-authored-by: Andrii Chebukin --- src/FSharp.Data.GraphQL.Server/Values.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FSharp.Data.GraphQL.Server/Values.fs b/src/FSharp.Data.GraphQL.Server/Values.fs index d7aa2ad6..7546cfa0 100644 --- a/src/FSharp.Data.GraphQL.Server/Values.fs +++ b/src/FSharp.Data.GraphQL.Server/Values.fs @@ -143,7 +143,7 @@ let rec internal compileByType else let expectedType = inputDef.Type.ToString () let actualType = paramType.ToString () - typeMismatchParameters.Add (param.Name, expectedType, actualType) + typeMismatchParameters.Add (struct (param.Name, expectedType, actualType)) |> ignore | None -> if From 566a9e359ef9b9fa77af3c9b2629eac5ebf0a648 Mon Sep 17 00:00:00 2001 From: Tuomas Hietanen Date: Thu, 30 Oct 2025 11:41:46 +0000 Subject: [PATCH 3/3] Update src/FSharp.Data.GraphQL.Server/Values.fs Co-authored-by: Andrii Chebukin --- src/FSharp.Data.GraphQL.Server/Values.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/FSharp.Data.GraphQL.Server/Values.fs b/src/FSharp.Data.GraphQL.Server/Values.fs index 7546cfa0..431e104b 100644 --- a/src/FSharp.Data.GraphQL.Server/Values.fs +++ b/src/FSharp.Data.GraphQL.Server/Values.fs @@ -179,9 +179,9 @@ let rec internal compileByType let details = typeMismatchParameters - |> Seq.map (fun (name, expected, actual) -> + |> Seq.map (fun struct (name, expected, actual) -> typeMismatchParameterNames.Add name |> ignore - sprintf "Parameter '%s': expected %s, got %s" name expected actual) + $"Parameter '%s{name}': expected '%s{expected}', got %s{actual}") |> String.concat "; " let message =