From b1d4e85570f248d3b665f387b055b6f8f1d4c3ce Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Mar 2026 21:54:45 +0000 Subject: [PATCH 1/3] Initial plan From bcbf23f6b94e7f5d49ae808754d6538b1aa74285 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Mar 2026 22:05:31 +0000 Subject: [PATCH 2/3] Add explicit null guard in toQueryParams and fix test comment Co-authored-by: sergey-tihon <1197905+sergey-tihon@users.noreply.github.com> --- src/SwaggerProvider.Runtime/RuntimeHelpers.fs | 4 ++++ tests/SwaggerProvider.Tests/RuntimeHelpersTests.fs | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/SwaggerProvider.Runtime/RuntimeHelpers.fs b/src/SwaggerProvider.Runtime/RuntimeHelpers.fs index e50f1e0d..adb73563 100644 --- a/src/SwaggerProvider.Runtime/RuntimeHelpers.fs +++ b/src/SwaggerProvider.Runtime/RuntimeHelpers.fs @@ -85,6 +85,10 @@ module RuntimeHelpers = | _ -> obj.ToString() let toQueryParams (name: string) (obj: obj) (client: Swagger.ProvidedApiClientBase) = + if isNull obj then + [] + else + match obj with | :? array as xs -> [ name, (client.Serialize xs).Trim('\"') ] // TODO: Need to verify how servers parse byte[] from query string | :? array as xs -> xs |> toStrArray name diff --git a/tests/SwaggerProvider.Tests/RuntimeHelpersTests.fs b/tests/SwaggerProvider.Tests/RuntimeHelpersTests.fs index 378f43fa..f6a9a3b6 100644 --- a/tests/SwaggerProvider.Tests/RuntimeHelpersTests.fs +++ b/tests/SwaggerProvider.Tests/RuntimeHelpersTests.fs @@ -152,8 +152,8 @@ module ToQueryParamsTests = [] let ``toQueryParams returns empty list for null input (treated as Option None)``() = - // In F#, None for reference option types is compiled as null at the .NET level, - // so a null obj matches Option None and returns an empty list. + // In F#, None for any option type is compiled as null at the .NET level, + // so a null obj is treated as Option None and returns an empty list. let result = toQueryParams "q" null stubClient result |> shouldEqual [] From e80051f96a10d4d6c65bef0a89551bd60e385bd6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Mar 2026 22:14:17 +0000 Subject: [PATCH 3/3] Apply Fantomas formatting to RuntimeHelpers.fs Co-authored-by: sergey-tihon <1197905+sergey-tihon@users.noreply.github.com> --- src/SwaggerProvider.Runtime/RuntimeHelpers.fs | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/SwaggerProvider.Runtime/RuntimeHelpers.fs b/src/SwaggerProvider.Runtime/RuntimeHelpers.fs index adb73563..9ee42e10 100644 --- a/src/SwaggerProvider.Runtime/RuntimeHelpers.fs +++ b/src/SwaggerProvider.Runtime/RuntimeHelpers.fs @@ -89,38 +89,38 @@ module RuntimeHelpers = [] else - match obj with - | :? array as xs -> [ name, (client.Serialize xs).Trim('\"') ] // TODO: Need to verify how servers parse byte[] from query string - | :? array as xs -> xs |> toStrArray name - | :? array as xs -> xs |> toStrArray name - | :? array as xs -> xs |> toStrArray name - | :? array as xs -> xs |> toStrArray name - | :? array as xs -> xs |> toStrArray name - | :? array as xs -> xs |> toStrArray name - | :? array as xs -> xs |> toStrArrayDateTime name - | :? array as xs -> xs |> toStrArrayDateTimeOffset name - | :? array as xs -> xs |> toStrArray name - | :? array> as xs -> xs |> toStrArrayOpt name - | :? array> as xs -> xs |> toStrArrayOpt name - | :? array> as xs -> xs |> toStrArrayOpt name - | :? array> as xs -> xs |> toStrArrayOpt name - | :? array> as xs -> xs |> toStrArrayOpt name - | :? array> as xs -> xs |> toStrArrayOpt name - | :? array> as xs -> xs |> toStrArrayDateTimeOpt name - | :? array> as xs -> xs |> toStrArrayDateTimeOffsetOpt name - | :? array> as xs -> xs |> toStrArray name - | :? Option as x -> x |> toStrOpt name - | :? Option as x -> x |> toStrOpt name - | :? Option as x -> x |> toStrOpt name - | :? Option as x -> x |> toStrOpt name - | :? Option as x -> x |> toStrOpt name - | :? Option as x -> x |> toStrOpt name - | :? Option as x -> x |> toStrDateTimeOpt name - | :? Option as x -> x |> toStrDateTimeOffsetOpt name - | :? DateTime as x -> [ name, x.ToString("O") ] - | :? DateTimeOffset as x -> [ name, x.ToString("O") ] - | :? Option as x -> x |> toStrOpt name - | _ -> [ name, obj.ToString() ] + match obj with + | :? array as xs -> [ name, (client.Serialize xs).Trim('\"') ] // TODO: Need to verify how servers parse byte[] from query string + | :? array as xs -> xs |> toStrArray name + | :? array as xs -> xs |> toStrArray name + | :? array as xs -> xs |> toStrArray name + | :? array as xs -> xs |> toStrArray name + | :? array as xs -> xs |> toStrArray name + | :? array as xs -> xs |> toStrArray name + | :? array as xs -> xs |> toStrArrayDateTime name + | :? array as xs -> xs |> toStrArrayDateTimeOffset name + | :? array as xs -> xs |> toStrArray name + | :? array> as xs -> xs |> toStrArrayOpt name + | :? array> as xs -> xs |> toStrArrayOpt name + | :? array> as xs -> xs |> toStrArrayOpt name + | :? array> as xs -> xs |> toStrArrayOpt name + | :? array> as xs -> xs |> toStrArrayOpt name + | :? array> as xs -> xs |> toStrArrayOpt name + | :? array> as xs -> xs |> toStrArrayDateTimeOpt name + | :? array> as xs -> xs |> toStrArrayDateTimeOffsetOpt name + | :? array> as xs -> xs |> toStrArray name + | :? Option as x -> x |> toStrOpt name + | :? Option as x -> x |> toStrOpt name + | :? Option as x -> x |> toStrOpt name + | :? Option as x -> x |> toStrOpt name + | :? Option as x -> x |> toStrOpt name + | :? Option as x -> x |> toStrOpt name + | :? Option as x -> x |> toStrDateTimeOpt name + | :? Option as x -> x |> toStrDateTimeOffsetOpt name + | :? DateTime as x -> [ name, x.ToString("O") ] + | :? DateTimeOffset as x -> [ name, x.ToString("O") ] + | :? Option as x -> x |> toStrOpt name + | _ -> [ name, obj.ToString() ] let getPropertyNameAttribute name = { new Reflection.CustomAttributeData() with