diff --git a/ConsumePlugin/GeneratedRestClient.fs b/ConsumePlugin/GeneratedRestClient.fs index c228486..2f8a174 100644 --- a/ConsumePlugin/GeneratedRestClient.fs +++ b/ConsumePlugin/GeneratedRestClient.fs @@ -10,6 +10,8 @@ open System open System.Threading open System.Threading.Tasks open System.IO +open System.Net +open System.Net.Http open RestEase /// Module for constructing a REST client. @@ -279,4 +281,84 @@ module PureGymApi = return node } |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) + + member _.GetResponseMessage (ct : CancellationToken option) = + async { + let! ct = Async.CancellationToken + + let uri = + System.Uri (client.BaseAddress, 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 node = response + return node + } + |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) + + member _.GetResponseMessage' (ct : CancellationToken option) = + async { + let! ct = Async.CancellationToken + + let uri = + System.Uri (client.BaseAddress, 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 node = response + return node + } + |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) + + member _.GetResponseMessage'' (ct : CancellationToken option) = + async { + let! ct = Async.CancellationToken + + let uri = + System.Uri (client.BaseAddress, 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 node = response + return node + } + |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) + + member _.GetResponseMessage''' (ct : CancellationToken option) = + async { + let! ct = Async.CancellationToken + + let uri = + System.Uri (client.BaseAddress, 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 node = response + return node + } + |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) } diff --git a/ConsumePlugin/RestApiExample.fs b/ConsumePlugin/RestApiExample.fs index ba86716..655c4db 100644 --- a/ConsumePlugin/RestApiExample.fs +++ b/ConsumePlugin/RestApiExample.fs @@ -4,6 +4,8 @@ open System open System.Threading open System.Threading.Tasks open System.IO +open System.Net +open System.Net.Http open RestEase [] @@ -39,3 +41,15 @@ type IPureGymApi = [] abstract GetStream'' : ?ct : CancellationToken -> Task + + [] + abstract GetResponseMessage : ?ct : CancellationToken -> Task + + [] + abstract GetResponseMessage' : ?ct : CancellationToken -> Task + + [] + abstract GetResponseMessage'' : ?ct : CancellationToken -> Task + + [] + abstract GetResponseMessage''' : ?ct : CancellationToken -> Task diff --git a/MyriadPlugin.Test/TestReturnTypes.fs b/MyriadPlugin.Test/TestReturnTypes.fs index 01b8bf7..91e7792 100644 --- a/MyriadPlugin.Test/TestReturnTypes.fs +++ b/MyriadPlugin.Test/TestReturnTypes.fs @@ -56,3 +56,33 @@ module TestReturnTypes = let buf = Array.zeroCreate 10 stream.Read (buf, 0, 10) |> shouldEqual 4 Array.take 4 buf |> shouldEqual result + + [] + [] + [] + [] + let ``HttpResponseMessage return`` (case : string) = + let mutable responseMessage = None + + let proc (message : HttpRequestMessage) : HttpResponseMessage Async = + async { + message.Method |> shouldEqual HttpMethod.Get + let content = new StringContent ("a response!") + 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 message = + match case with + | "GetResponseMessage" -> api.GetResponseMessage().Result + | "GetResponseMessage'" -> api.GetResponseMessage'().Result + | "GetResponseMessage''" -> api.GetResponseMessage''().Result + | "GetResponseMessage'''" -> api.GetResponseMessage'''().Result + | _ -> failwith $"unrecognised case: %s{case}" + + Object.ReferenceEquals (message, Option.get responseMessage) |> shouldEqual true diff --git a/WoofWare.Myriad.Plugins/AstHelper.fs b/WoofWare.Myriad.Plugins/AstHelper.fs index bdeddaf..a31f431 100644 --- a/WoofWare.Myriad.Plugins/AstHelper.fs +++ b/WoofWare.Myriad.Plugins/AstHelper.fs @@ -116,6 +116,17 @@ module internal SynTypePatterns = | _ -> None | _ -> None + let (|HttpResponseMessage|_|) (fieldType : SynType) : unit option = + match fieldType with + | SynType.LongIdent ident -> + match ident.LongIdent |> List.map (fun i -> i.idText) with + | [ "System" ; "Net" ; "Http" ; "HttpResponseMessage" ] + | [ "Net" ; "Http" ; "HttpResponseMessage" ] + | [ "Http" ; "HttpResponseMessage" ] + | [ "HttpResponseMessage" ] -> Some () + | _ -> None + | _ -> None + let (|Stream|_|) (fieldType : SynType) : unit option = match fieldType with | SynType.LongIdent ident -> diff --git a/WoofWare.Myriad.Plugins/HttpClientGenerator.fs b/WoofWare.Myriad.Plugins/HttpClientGenerator.fs index 96212a7..e71d4bd 100644 --- a/WoofWare.Myriad.Plugins/HttpClientGenerator.fs +++ b/WoofWare.Myriad.Plugins/HttpClientGenerator.fs @@ -331,6 +331,7 @@ module internal HttpClientGenerator = let returnExpr = match info.ReturnType with + | HttpResponseMessage | String | Stream -> SynExpr.CreateIdentString "node" | _ -> @@ -400,6 +401,7 @@ module internal HttpClientGenerator = ) ) match info.ReturnType with + | HttpResponseMessage -> yield Let ("node", SynExpr.CreateIdentString "response") | String -> yield LetBang (