diff --git a/ConsumePlugin/GeneratedRestClient.fs b/ConsumePlugin/GeneratedRestClient.fs index a089fc3..614c5c5 100644 --- a/ConsumePlugin/GeneratedRestClient.fs +++ b/ConsumePlugin/GeneratedRestClient.fs @@ -43,13 +43,13 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - let! node = - System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct) + let! jsonNode = + System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) |> Async.AwaitTask - return node.AsArray () |> Seq.map (fun elt -> Gym.jsonParse elt) |> List.ofSeq + return jsonNode.AsArray () |> Seq.map (fun elt -> Gym.jsonParse elt) |> List.ofSeq } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -77,13 +77,13 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - let! node = - System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct) + let! jsonNode = + System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) |> Async.AwaitTask - return GymAttendance.jsonParse node + return GymAttendance.jsonParse jsonNode } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -107,13 +107,13 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - let! node = - System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct) + let! jsonNode = + System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) |> Async.AwaitTask - return Member.jsonParse node + return Member.jsonParse jsonNode } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -141,13 +141,13 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - let! node = - System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct) + let! jsonNode = + System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) |> Async.AwaitTask - return Gym.jsonParse node + return Gym.jsonParse jsonNode } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -171,13 +171,13 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - let! node = - System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct) + let! jsonNode = + System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) |> Async.AwaitTask - return MemberActivityDto.jsonParse node + return MemberActivityDto.jsonParse jsonNode } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -201,13 +201,13 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - let! node = - System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct) + let! jsonNode = + System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) |> Async.AwaitTask - return UriThing.jsonParse node + return UriThing.jsonParse jsonNode } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -238,13 +238,13 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - let! node = - System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct) + let! jsonNode = + System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) |> Async.AwaitTask - return Sessions.jsonParse node + return Sessions.jsonParse jsonNode } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -270,8 +270,8 @@ module PureGymApi = do httpMessage.Content <- queryParams let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! node = response.Content.ReadAsStringAsync ct |> Async.AwaitTask - return node + let! responseString = response.Content.ReadAsStringAsync ct |> Async.AwaitTask + return responseString } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -297,8 +297,8 @@ module PureGymApi = do httpMessage.Content <- queryParams let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! node = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - return node + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + return responseStream } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -324,8 +324,8 @@ module PureGymApi = do httpMessage.Content <- queryParams let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! node = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - return node + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + return responseStream } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -351,8 +351,8 @@ module PureGymApi = do httpMessage.Content <- queryParams let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! node = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - return node + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + return responseStream } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -378,8 +378,8 @@ module PureGymApi = do httpMessage.Content <- queryParams let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! node = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - return node + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + return responseStream } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -404,8 +404,8 @@ module PureGymApi = do httpMessage.Content <- user let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! node = response.Content.ReadAsStringAsync ct |> Async.AwaitTask - return node + let! responseString = response.Content.ReadAsStringAsync ct |> Async.AwaitTask + return responseString } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -433,8 +433,8 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! node = response.Content.ReadAsStringAsync ct |> Async.AwaitTask - return node + let! responseString = response.Content.ReadAsStringAsync ct |> Async.AwaitTask + return responseString } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -458,8 +458,8 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! node = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - return node + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + return responseStream } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -483,8 +483,8 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! node = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - return node + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + return responseStream } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -508,8 +508,8 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! node = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - return node + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + return responseStream } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -533,8 +533,7 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let node = response - return node + return response } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -558,8 +557,7 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let node = response - return node + return response } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -583,8 +581,7 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let node = response - return node + return response } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -608,8 +605,151 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let node = response - return node + return response + } + |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) + + member _.GetResponse (ct : CancellationToken option) = + async { + let! ct = Async.CancellationToken + + let uri = + System.Uri ( + (match client.BaseAddress with + | null -> System.Uri "https://whatnot.com" + | v -> v), + System.Uri ("endpoint", System.UriKind.Relative) + ) + + let httpMessage = + new System.Net.Http.HttpRequestMessage ( + Method = System.Net.Http.HttpMethod.Get, + RequestUri = uri + ) + + let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask + let response = response.EnsureSuccessStatusCode () + let! responseString = response.Content.ReadAsStringAsync ct |> Async.AwaitTask + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + + let! jsonNode = + System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) + |> Async.AwaitTask + + return + new RestEase.Response<_> ( + responseString, + response, + (fun () -> (MemberActivityDto.jsonParse jsonNode)) + ) + } + |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) + + member _.GetResponse' (ct : CancellationToken option) = + async { + let! ct = Async.CancellationToken + + let uri = + System.Uri ( + (match client.BaseAddress with + | null -> System.Uri "https://whatnot.com" + | v -> v), + System.Uri ("endpoint", System.UriKind.Relative) + ) + + let httpMessage = + new System.Net.Http.HttpRequestMessage ( + Method = System.Net.Http.HttpMethod.Get, + RequestUri = uri + ) + + let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask + let response = response.EnsureSuccessStatusCode () + let! responseString = response.Content.ReadAsStringAsync ct |> Async.AwaitTask + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + + let! jsonNode = + System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) + |> Async.AwaitTask + + return + new RestEase.Response<_> ( + responseString, + response, + (fun () -> (MemberActivityDto.jsonParse jsonNode)) + ) + } + |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) + + member _.GetResponse'' (ct : CancellationToken option) = + async { + let! ct = Async.CancellationToken + + let uri = + System.Uri ( + (match client.BaseAddress with + | null -> System.Uri "https://whatnot.com" + | v -> v), + System.Uri ("endpoint", System.UriKind.Relative) + ) + + let httpMessage = + new System.Net.Http.HttpRequestMessage ( + Method = System.Net.Http.HttpMethod.Get, + RequestUri = uri + ) + + let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask + let response = response.EnsureSuccessStatusCode () + let! responseString = response.Content.ReadAsStringAsync ct |> Async.AwaitTask + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + + let! jsonNode = + System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) + |> Async.AwaitTask + + return + new RestEase.Response<_> ( + responseString, + response, + (fun () -> (MemberActivityDto.jsonParse jsonNode)) + ) + } + |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) + + member _.GetResponse''' (ct : CancellationToken option) = + async { + let! ct = Async.CancellationToken + + let uri = + System.Uri ( + (match client.BaseAddress with + | null -> System.Uri "https://whatnot.com" + | v -> v), + System.Uri ("endpoint", System.UriKind.Relative) + ) + + let httpMessage = + new System.Net.Http.HttpRequestMessage ( + Method = System.Net.Http.HttpMethod.Get, + RequestUri = uri + ) + + let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask + let response = response.EnsureSuccessStatusCode () + let! responseString = response.Content.ReadAsStringAsync ct |> Async.AwaitTask + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + + let! jsonNode = + System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) + |> Async.AwaitTask + + return + new RestEase.Response<_> ( + responseString, + response, + (fun () -> (MemberActivityDto.jsonParse jsonNode)) + ) } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -632,8 +772,7 @@ module PureGymApi = ) let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask - let node = response - return node + return response } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -657,8 +796,7 @@ module PureGymApi = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let node = response - return node + return response } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) } @@ -709,8 +847,8 @@ module internal ApiWithoutBaseAddress = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! node = response.Content.ReadAsStringAsync ct |> Async.AwaitTask - return node + let! responseString = response.Content.ReadAsStringAsync ct |> Async.AwaitTask + return responseString } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) } @@ -761,8 +899,8 @@ module ApiWithBasePath = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! node = response.Content.ReadAsStringAsync ct |> Async.AwaitTask - return node + let! responseString = response.Content.ReadAsStringAsync ct |> Async.AwaitTask + return responseString } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) } @@ -807,8 +945,8 @@ module ApiWithBasePathAndAddress = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! node = response.Content.ReadAsStringAsync ct |> Async.AwaitTask - return node + let! responseString = response.Content.ReadAsStringAsync ct |> Async.AwaitTask + return responseString } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) } diff --git a/ConsumePlugin/GeneratedVault.fs b/ConsumePlugin/GeneratedVault.fs index 30d27e0..4abd2b1 100644 --- a/ConsumePlugin/GeneratedVault.fs +++ b/ConsumePlugin/GeneratedVault.fs @@ -502,13 +502,13 @@ module VaultClient = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - let! node = - System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct) + let! jsonNode = + System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) |> Async.AwaitTask - return JwtSecretResponse.jsonParse node + return JwtSecretResponse.jsonParse jsonNode } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) @@ -538,13 +538,13 @@ module VaultClient = let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask let response = response.EnsureSuccessStatusCode () - let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask + let! responseStream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask - let! node = - System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct) + let! jsonNode = + System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) |> Async.AwaitTask - return JwtVaultResponse.jsonParse node + return JwtVaultResponse.jsonParse jsonNode } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) } diff --git a/ConsumePlugin/RestApiExample.fs b/ConsumePlugin/RestApiExample.fs index b1bafb6..38453e0 100644 --- a/ConsumePlugin/RestApiExample.fs +++ b/ConsumePlugin/RestApiExample.fs @@ -18,7 +18,7 @@ type IPureGymApi = abstract GetGymAttendance : [] gymId : int * ?ct : CancellationToken -> Task [] - abstract GetMember : ?ct : CancellationToken -> Task + abstract GetMember : ?ct : CancellationToken -> Member Task [] abstract GetGym : [] gymId : int * ?ct : CancellationToken -> Task @@ -78,6 +78,18 @@ type IPureGymApi = [] abstract GetResponseMessage''' : ?ct : CancellationToken -> Task + [] + abstract GetResponse : ?ct : CancellationToken -> Task> + + [] + abstract GetResponse' : ?ct : CancellationToken -> Task> + + [] + abstract GetResponse'' : ?ct : CancellationToken -> Task + + [] + abstract GetResponse''' : ?ct : CancellationToken -> Task + [] [] abstract GetWithAnyReturnCode : ?ct : CancellationToken -> Task diff --git a/WoofWare.Myriad.Plugins.Test/TestHttpClient/TestReturnTypes.fs b/WoofWare.Myriad.Plugins.Test/TestHttpClient/TestReturnTypes.fs index 6eab222..eb92050 100644 --- a/WoofWare.Myriad.Plugins.Test/TestHttpClient/TestReturnTypes.fs +++ b/WoofWare.Myriad.Plugins.Test/TestHttpClient/TestReturnTypes.fs @@ -86,3 +86,36 @@ module TestReturnTypes = | _ -> failwith $"unrecognised case: %s{case}" Object.ReferenceEquals (message, Option.get responseMessage) |> shouldEqual true + + [">] + [">] + [] + [] + let ``Response return`` (case : string) = + for json, memberDto in PureGymDtos.memberActivityDtoCases do + let mutable responseMessage = None + + let proc (message : HttpRequestMessage) : HttpResponseMessage Async = + async { + message.Method |> shouldEqual HttpMethod.Get + let content = new StringContent (json) + let resp = new HttpResponseMessage (HttpStatusCode.OK) + resp.Content <- content + responseMessage <- Some resp + return resp + } + + use client = HttpClientMock.make (Uri "https://example.com") proc + let api = PureGymApi.make client + + let response = + match case with + | "Task" -> api.GetResponse().Result + | "Task" -> api.GetResponse'().Result + | "Response Task" -> api.GetResponse''().Result + | "RestEase.Response Task" -> api.GetResponse'''().Result + | _ -> failwith $"unrecognised case: %s{case}" + + response.ResponseMessage |> shouldEqual (Option.get responseMessage) + response.StringContent |> shouldEqual json + response.GetContent () |> shouldEqual memberDto diff --git a/WoofWare.Myriad.Plugins/AstHelper.fs b/WoofWare.Myriad.Plugins/AstHelper.fs index 4ac1c75..dc195b7 100644 --- a/WoofWare.Myriad.Plugins/AstHelper.fs +++ b/WoofWare.Myriad.Plugins/AstHelper.fs @@ -104,6 +104,12 @@ module internal AstHelper = true | _ -> false + let isResponseIdent (ident : SynLongIdent) : bool = + match ident.LongIdent |> List.map _.idText with + | [ "Response" ] + | [ "RestEase" ; "Response" ] -> true + | _ -> false + let isMapIdent (ident : SynLongIdent) : bool = match ident.LongIdent |> List.map _.idText with | [ "Map" ] -> true @@ -362,6 +368,12 @@ module internal SynTypePatterns = | SynType.Array (1, innerType, _) -> Some innerType | _ -> None + let (|RestEaseResponseType|_|) (fieldType : SynType) = + match fieldType with + | SynType.App (SynType.LongIdent ident, _, [ innerType ], _, _, _, _) when AstHelper.isResponseIdent ident -> + Some innerType + | _ -> None + let (|DictionaryType|_|) (fieldType : SynType) = match fieldType with | SynType.App (SynType.LongIdent ident, _, [ key ; value ], _, _, _, _) when AstHelper.isDictionaryIdent ident -> diff --git a/WoofWare.Myriad.Plugins/HttpClientGenerator.fs b/WoofWare.Myriad.Plugins/HttpClientGenerator.fs index 3e2b8f5..344ee1f 100644 --- a/WoofWare.Myriad.Plugins/HttpClientGenerator.fs +++ b/WoofWare.Myriad.Plugins/HttpClientGenerator.fs @@ -399,15 +399,47 @@ module internal HttpClientGenerator = let returnExpr = match info.TaskReturnType with - | HttpResponseMessage - | String - | Stream -> SynExpr.CreateIdentString "node" + | HttpResponseMessage -> SynExpr.CreateIdentString "response" + | String -> SynExpr.CreateIdentString "responseString" + | Stream -> SynExpr.CreateIdentString "responseStream" + | RestEaseResponseType contents -> + let deserialiser = + SynExpr.CreateLambda ( + [ SynPat.CreateConst SynConst.Unit ], + SynExpr.CreateParen ( + JsonParseGenerator.parseNode + None + JsonParseGenerator.JsonParseOption.None + contents + (SynExpr.CreateIdentString "jsonNode") + ) + ) + // new RestEase.Response (content : string, response : HttpResponseMessage, deserialiser : unit -> 'T) + SynExpr.New ( + false, + SynType.App ( + SynType.CreateLongIdent (SynLongIdent.Create [ "RestEase" ; "Response" ]), + Some range0, + [ SynType.Anon range0 ], + [], + Some range0, + false, + range0 + ), + SynExpr.CreateParenedTuple + [ + SynExpr.CreateIdentString "responseString" + SynExpr.CreateIdentString "response" + SynExpr.CreateParen deserialiser + ], + range0 + ) | retType -> JsonParseGenerator.parseNode None JsonParseGenerator.JsonParseOption.None retType - (SynExpr.CreateIdentString "node") + (SynExpr.CreateIdentString "jsonNode") let handleBodyParams = match bodyParam with @@ -475,6 +507,51 @@ module internal HttpClientGenerator = *) let implementation = + let responseString = + LetBang ( + "responseString", + SynExpr.awaitTask ( + SynExpr.CreateApp ( + SynExpr.CreateLongIdent ( + SynLongIdent.Create [ "response" ; "Content" ; "ReadAsStringAsync" ] + ), + SynExpr.CreateIdentString "ct" + ) + ) + ) + + let responseStream = + LetBang ( + "responseStream", + SynExpr.awaitTask ( + SynExpr.CreateApp ( + SynExpr.CreateLongIdent ( + SynLongIdent.Create [ "response" ; "Content" ; "ReadAsStreamAsync" ] + ), + SynExpr.CreateIdentString "ct" + ) + ) + ) + + let jsonNode = + LetBang ( + "jsonNode", + SynExpr.awaitTask ( + SynExpr.CreateApp ( + SynExpr.CreateLongIdent ( + SynLongIdent.Create [ "System" ; "Text" ; "Json" ; "Nodes" ; "JsonNode" ; "ParseAsync" ] + ), + SynExpr.CreateParenedTuple + [ + SynExpr.CreateIdentString "responseStream" + SynExpr.equals + (SynExpr.CreateIdentString "cancellationToken") + (SynExpr.CreateIdentString "ct") + ] + ) + ) + ) + [ yield LetBang ("ct", SynExpr.CreateLongIdent (SynLongIdent.Create [ "Async" ; "CancellationToken" ])) yield Let ("uri", requestUri) @@ -514,66 +591,16 @@ module internal HttpClientGenerator = ) ) match info.TaskReturnType with - | HttpResponseMessage -> yield Let ("node", SynExpr.CreateIdentString "response") - | String -> - yield - LetBang ( - "node", - SynExpr.awaitTask ( - SynExpr.CreateApp ( - SynExpr.CreateLongIdent ( - SynLongIdent.Create [ "response" ; "Content" ; "ReadAsStringAsync" ] - ), - SynExpr.CreateIdentString "ct" - ) - ) - ) - | Stream -> - yield - LetBang ( - "node", - SynExpr.awaitTask ( - SynExpr.CreateApp ( - SynExpr.CreateLongIdent ( - SynLongIdent.Create [ "response" ; "Content" ; "ReadAsStreamAsync" ] - ), - SynExpr.CreateIdentString "ct" - ) - ) - ) + | HttpResponseMessage -> () + | RestEaseResponseType _ -> + yield responseString + yield responseStream + yield jsonNode + | String -> yield responseString + | Stream -> yield responseStream | _ -> - yield - LetBang ( - "stream", - SynExpr.awaitTask ( - SynExpr.CreateApp ( - SynExpr.CreateLongIdent ( - SynLongIdent.Create [ "response" ; "Content" ; "ReadAsStreamAsync" ] - ), - SynExpr.CreateIdentString "ct" - ) - ) - ) - - yield - LetBang ( - "node", - SynExpr.awaitTask ( - SynExpr.CreateApp ( - SynExpr.CreateLongIdent ( - SynLongIdent.Create - [ "System" ; "Text" ; "Json" ; "Nodes" ; "JsonNode" ; "ParseAsync" ] - ), - SynExpr.CreateParenedTuple - [ - SynExpr.CreateIdentString "stream" - SynExpr.equals - (SynExpr.CreateIdentString "cancellationToken") - (SynExpr.CreateIdentString "ct") - ] - ) - ) - ) + yield responseStream + yield jsonNode ] |> SynExpr.createCompExpr "async" returnExpr |> SynExpr.startAsTask