diff --git a/ConsumePlugin/RestApiExample.fs b/ConsumePlugin/RestApiExample.fs index f373d2d..9b1ca03 100644 --- a/ConsumePlugin/RestApiExample.fs +++ b/ConsumePlugin/RestApiExample.fs @@ -120,7 +120,8 @@ type internal IApiWithoutBaseAddress = [] [] type IApiWithBasePath = - [] + // Example where we use the bundled attributes rather than RestEase's + [] abstract GetPathParam : [] parameter : string * ?cancellationToken : CancellationToken -> Task [] diff --git a/WoofWare.Myriad.Plugins.Attributes/RestEase.fs b/WoofWare.Myriad.Plugins.Attributes/RestEase.fs new file mode 100644 index 0000000..ba4dd8b --- /dev/null +++ b/WoofWare.Myriad.Plugins.Attributes/RestEase.fs @@ -0,0 +1,59 @@ +namespace WoofWare.Myriad.Plugins + +open System + +/// Module containing duplicates of the supported RestEase attributes, in case you don't want +/// to take a dependency on RestEase. +[] +module RestEase = + /// Indicates that a method represents an HTTP Get query to the specified endpoint. + type GetAttribute (path : string) = + inherit Attribute () + + /// Indicates that a method represents an HTTP Post query to the specified endpoint. + type PostAttribute (path : string) = + inherit Attribute () + + /// Indicates that a method represents an HTTP Delete query to the specified endpoint. + type DeleteAttribute (path : string) = + inherit Attribute () + + /// Indicates that a method represents an HTTP Head query to the specified endpoint. + type HeadAttribute (path : string) = + inherit Attribute () + + /// Indicates that a method represents an HTTP Options query to the specified endpoint. + type OptionsAttribute (path : string) = + inherit Attribute () + + /// Indicates that a method represents an HTTP Put query to the specified endpoint. + type PutAttribute (path : string) = + inherit Attribute () + + /// Indicates that a method represents an HTTP Patch query to the specified endpoint. + type PatchAttribute (path : string) = + inherit Attribute () + + /// Indicates that a method represents an HTTP Trace query to the specified endpoint. + type TraceAttribute (path : string) = + inherit Attribute () + + /// Indicates that this argument to a method is interpolated into the HTTP request at runtime + /// by setting a query parameter (with the given name) to the value of the annotated argument. + type QueryAttribute (paramName : string) = + inherit Attribute () + + /// Indicates that this interface represents a REST client which accesses an API whose paths are + /// all relative to the given address. + type BaseAddressAttribute (addr : string) = + inherit Attribute () + + /// Indicates that this interface member causes the interface to set a header with the given name, + /// whose value is obtained whenever required by a fresh call to the interface member. + type HeaderAttribute (header : string) = + inherit Attribute () + + /// Indicates that this argument to a method is interpolated into the request path at runtime + /// by writing it into the templated string that specifies the HTTP query e.g. in the `[]`. + type PathAttribute () = + inherit Attribute () diff --git a/WoofWare.Myriad.Plugins.Attributes/SurfaceBaseline.txt b/WoofWare.Myriad.Plugins.Attributes/SurfaceBaseline.txt index 77f474a..f22b412 100644 --- a/WoofWare.Myriad.Plugins.Attributes/SurfaceBaseline.txt +++ b/WoofWare.Myriad.Plugins.Attributes/SurfaceBaseline.txt @@ -18,4 +18,29 @@ WoofWare.Myriad.Plugins.JsonSerializeAttribute..ctor [constructor]: unit WoofWare.Myriad.Plugins.JsonSerializeAttribute.DefaultIsExtensionMethod [static property]: [read-only] bool WoofWare.Myriad.Plugins.JsonSerializeAttribute.get_DefaultIsExtensionMethod [static method]: unit -> bool WoofWare.Myriad.Plugins.RemoveOptionsAttribute inherit System.Attribute -WoofWare.Myriad.Plugins.RemoveOptionsAttribute..ctor [constructor]: unit \ No newline at end of file +WoofWare.Myriad.Plugins.RemoveOptionsAttribute..ctor [constructor]: unit +WoofWare.Myriad.Plugins.RestEase inherit obj +WoofWare.Myriad.Plugins.RestEase+BaseAddressAttribute inherit System.Attribute +WoofWare.Myriad.Plugins.RestEase+BaseAddressAttribute..ctor [constructor]: string +WoofWare.Myriad.Plugins.RestEase+DeleteAttribute inherit System.Attribute +WoofWare.Myriad.Plugins.RestEase+DeleteAttribute..ctor [constructor]: string +WoofWare.Myriad.Plugins.RestEase+GetAttribute inherit System.Attribute +WoofWare.Myriad.Plugins.RestEase+GetAttribute..ctor [constructor]: string +WoofWare.Myriad.Plugins.RestEase+HeadAttribute inherit System.Attribute +WoofWare.Myriad.Plugins.RestEase+HeadAttribute..ctor [constructor]: string +WoofWare.Myriad.Plugins.RestEase+HeaderAttribute inherit System.Attribute +WoofWare.Myriad.Plugins.RestEase+HeaderAttribute..ctor [constructor]: string +WoofWare.Myriad.Plugins.RestEase+OptionsAttribute inherit System.Attribute +WoofWare.Myriad.Plugins.RestEase+OptionsAttribute..ctor [constructor]: string +WoofWare.Myriad.Plugins.RestEase+PatchAttribute inherit System.Attribute +WoofWare.Myriad.Plugins.RestEase+PatchAttribute..ctor [constructor]: string +WoofWare.Myriad.Plugins.RestEase+PathAttribute inherit System.Attribute +WoofWare.Myriad.Plugins.RestEase+PathAttribute..ctor [constructor]: unit +WoofWare.Myriad.Plugins.RestEase+PostAttribute inherit System.Attribute +WoofWare.Myriad.Plugins.RestEase+PostAttribute..ctor [constructor]: string +WoofWare.Myriad.Plugins.RestEase+PutAttribute inherit System.Attribute +WoofWare.Myriad.Plugins.RestEase+PutAttribute..ctor [constructor]: string +WoofWare.Myriad.Plugins.RestEase+QueryAttribute inherit System.Attribute +WoofWare.Myriad.Plugins.RestEase+QueryAttribute..ctor [constructor]: string +WoofWare.Myriad.Plugins.RestEase+TraceAttribute inherit System.Attribute +WoofWare.Myriad.Plugins.RestEase+TraceAttribute..ctor [constructor]: string \ No newline at end of file diff --git a/WoofWare.Myriad.Plugins.Attributes/Test/TestSurface.fs b/WoofWare.Myriad.Plugins.Attributes/Test/TestSurface.fs index 4a68e62..1df76fe 100644 --- a/WoofWare.Myriad.Plugins.Attributes/Test/TestSurface.fs +++ b/WoofWare.Myriad.Plugins.Attributes/Test/TestSurface.fs @@ -11,11 +11,9 @@ module TestSurface = [] let ``Ensure API surface has not been modified`` () = ApiSurface.assertIdentical assembly - (* [] let ``Check version against remote`` () = MonotonicVersion.validate assembly "WoofWare.Myriad.Plugins.Attributes" - *) [] let ``Update API surface`` () = diff --git a/WoofWare.Myriad.Plugins.Attributes/WoofWare.Myriad.Plugins.Attributes.fsproj b/WoofWare.Myriad.Plugins.Attributes/WoofWare.Myriad.Plugins.Attributes.fsproj index 1194989..eb8a789 100644 --- a/WoofWare.Myriad.Plugins.Attributes/WoofWare.Myriad.Plugins.Attributes.fsproj +++ b/WoofWare.Myriad.Plugins.Attributes/WoofWare.Myriad.Plugins.Attributes.fsproj @@ -19,6 +19,7 @@ + diff --git a/WoofWare.Myriad.Plugins.Attributes/version.json b/WoofWare.Myriad.Plugins.Attributes/version.json index 70765f7..c8ba3f6 100644 --- a/WoofWare.Myriad.Plugins.Attributes/version.json +++ b/WoofWare.Myriad.Plugins.Attributes/version.json @@ -1,7 +1,7 @@ { - "version": "2.2", + "version": "2.3", "publicReleaseRefSpec": [ "^refs/heads/main$" ], "pathFilters": null -} +} \ No newline at end of file diff --git a/WoofWare.Myriad.Plugins/HttpClientGenerator.fs b/WoofWare.Myriad.Plugins/HttpClientGenerator.fs index eba2fe4..3ae70c7 100644 --- a/WoofWare.Myriad.Plugins/HttpClientGenerator.fs +++ b/WoofWare.Myriad.Plugins/HttpClientGenerator.fs @@ -82,34 +82,50 @@ module internal HttpClientGenerator = match attr.TypeName.AsString with | "Get" | "GetAttribute" + | "WoofWare.Myriad.Plugins.RestEase.Get" + | "WoofWare.Myriad.Plugins.RestEase.GetAttribute" | "RestEase.Get" | "RestEase.GetAttribute" -> Some (HttpMethod.Get, attr.ArgExpr) | "Post" | "PostAttribute" + | "WoofWare.Myriad.Plugins.RestEase.Post" + | "WoofWare.Myriad.Plugins.RestEase.PostAttribute" | "RestEase.Post" | "RestEase.PostAttribute" -> Some (HttpMethod.Post, attr.ArgExpr) | "Put" | "PutAttribute" + | "WoofWare.Myriad.Plugins.RestEase.Put" + | "WoofWare.Myriad.Plugins.RestEase.PutAttribute" | "RestEase.Put" | "RestEase.PutAttribute" -> Some (HttpMethod.Put, attr.ArgExpr) | "Delete" | "DeleteAttribute" + | "WoofWare.Myriad.Plugins.RestEase.Delete" + | "WoofWare.Myriad.Plugins.RestEase.DeleteAttribute" | "RestEase.Delete" | "RestEase.DeleteAttribute" -> Some (HttpMethod.Delete, attr.ArgExpr) | "Head" | "HeadAttribute" + | "WoofWare.Myriad.Plugins.RestEase.Head" + | "WoofWare.Myriad.Plugins.RestEase.HeadAttribute" | "RestEase.Head" | "RestEase.HeadAttribute" -> Some (HttpMethod.Head, attr.ArgExpr) | "Options" | "OptionsAttribute" + | "WoofWare.Myriad.Plugins.RestEase.Options" + | "WoofWare.Myriad.Plugins.RestEase.OptionsAttribute" | "RestEase.Options" | "RestEase.OptionsAttribute" -> Some (HttpMethod.Options, attr.ArgExpr) | "Patch" | "PatchAttribute" + | "WoofWare.Myriad.Plugins.RestEase.Patch" + | "WoofWare.Myriad.Plugins.RestEase.PatchAttribute" | "RestEase.Patch" | "RestEase.PatchAttribute" -> Some (HttpMethod.Patch, attr.ArgExpr) | "Trace" | "TraceAttribute" + | "WoofWare.Myriad.Plugins.RestEase.Trace" + | "WoofWare.Myriad.Plugins.RestEase.TraceAttribute" | "RestEase.Trace" | "RestEase.TraceAttribute" -> Some (HttpMethod.Trace, attr.ArgExpr) | _ -> None