diff --git a/src/SwaggerProvider.Runtime/RuntimeHelpers.fs b/src/SwaggerProvider.Runtime/RuntimeHelpers.fs index e50f1e0d..9ee42e10 100644 --- a/src/SwaggerProvider.Runtime/RuntimeHelpers.fs +++ b/src/SwaggerProvider.Runtime/RuntimeHelpers.fs @@ -85,38 +85,42 @@ module RuntimeHelpers = | _ -> obj.ToString() let toQueryParams (name: string) (obj: obj) (client: Swagger.ProvidedApiClientBase) = - 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() ] + 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 + | :? 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 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 []