packages feed

servant-hateoas 0.3.2 → 0.3.3

raw patch · 4 files changed

+161/−63 lines, 4 filesdep +network-uriPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: network-uri

API changes (from Hackage documentation)

- Servant.Hateoas.Layer.Build: instance (c GHC.Types.~ Servant.Hateoas.Layer.Type.MkPrefix (apiCs Servant.Hateoas.Layer.Type.++ '[Servant.API.Capture.Capture' mods sym x]) verb, Servant.Hateoas.RelationLink.HasRelationLink c, GHC.TypeLits.KnownSymbol sym, Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs cs verb) m, buildLinksFun GHC.Types.~ Servant.Hateoas.Layer.Build.ReplaceHandler (Servant.Server.Internal.ServerT (Servant.Hateoas.Layer.Type.MkPrefix apiCs verb) m) [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)], Servant.Hateoas.Internal.Polyvariadic.PolyvariadicComp buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun), Servant.Hateoas.Internal.Polyvariadic.Replace buildLinksFun [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)] (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ buildLinksFun, Servant.Hateoas.Internal.Polyvariadic.Return buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)]) => Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs (Servant.API.Capture.Capture' mods sym x : cs) verb) m
- Servant.Hateoas.Layer.Build: instance (c GHC.Types.~ Servant.Hateoas.Layer.Type.MkPrefix (apiCs Servant.Hateoas.Layer.Type.++ '[Servant.API.Capture.CaptureAll sym x]) verb, Servant.Hateoas.RelationLink.HasRelationLink c, GHC.TypeLits.KnownSymbol sym, Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs cs verb) m, buildLinksFun GHC.Types.~ Servant.Hateoas.Layer.Build.ReplaceHandler (Servant.Server.Internal.ServerT (Servant.Hateoas.Layer.Type.MkPrefix apiCs verb) m) [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)], Servant.Hateoas.Internal.Polyvariadic.PolyvariadicComp buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun), Servant.Hateoas.Internal.Polyvariadic.Replace buildLinksFun [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)] (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ buildLinksFun, Servant.Hateoas.Internal.Polyvariadic.Return buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)]) => Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs (Servant.API.Capture.CaptureAll sym x : cs) verb) m
- Servant.Hateoas.Layer.Build: instance (c GHC.Types.~ Servant.Hateoas.Layer.Type.MkPrefix (apiCs Servant.Hateoas.Layer.Type.++ '[Servant.API.QueryParam.QueryFlag sym]) verb, Servant.Hateoas.RelationLink.HasRelationLink c, GHC.TypeLits.KnownSymbol sym, Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs cs verb) m, buildLinksFun GHC.Types.~ Servant.Hateoas.Layer.Build.ReplaceHandler (Servant.Server.Internal.ServerT (Servant.Hateoas.Layer.Type.MkPrefix apiCs verb) m) [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)], Servant.Hateoas.Internal.Polyvariadic.PolyvariadicComp buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun), Servant.Hateoas.Internal.Polyvariadic.Replace buildLinksFun [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)] (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ buildLinksFun, Servant.Hateoas.Internal.Polyvariadic.Return buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)]) => Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs (Servant.API.QueryParam.QueryFlag sym : cs) verb) m
- Servant.Hateoas.Layer.Build: instance (c GHC.Types.~ Servant.Hateoas.Layer.Type.MkPrefix (apiCs Servant.Hateoas.Layer.Type.++ '[Servant.API.QueryParam.QueryParam' mods sym x]) verb, Servant.Hateoas.RelationLink.HasRelationLink c, GHC.TypeLits.KnownSymbol sym, Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs cs verb) m, buildLinksFun GHC.Types.~ Servant.Hateoas.Layer.Build.ReplaceHandler (Servant.Server.Internal.ServerT (Servant.Hateoas.Layer.Type.MkPrefix apiCs verb) m) [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)], Servant.Hateoas.Internal.Polyvariadic.PolyvariadicComp buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun), Servant.Hateoas.Internal.Polyvariadic.Replace buildLinksFun [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)] (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ buildLinksFun, Servant.Hateoas.Internal.Polyvariadic.Return buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)]) => Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs (Servant.API.QueryParam.QueryParam' mods sym x : cs) verb) m
- Servant.Hateoas.Layer.Build: instance (c GHC.Types.~ Servant.Hateoas.Layer.Type.MkPrefix (apiCs Servant.Hateoas.Layer.Type.++ '[Servant.API.QueryParam.QueryParams sym x]) verb, Servant.Hateoas.RelationLink.HasRelationLink c, GHC.TypeLits.KnownSymbol sym, Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs cs verb) m, buildLinksFun GHC.Types.~ Servant.Hateoas.Layer.Build.ReplaceHandler (Servant.Server.Internal.ServerT (Servant.Hateoas.Layer.Type.MkPrefix apiCs verb) m) [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)], Servant.Hateoas.Internal.Polyvariadic.PolyvariadicComp buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun), Servant.Hateoas.Internal.Polyvariadic.Replace buildLinksFun [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)] (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ buildLinksFun, Servant.Hateoas.Internal.Polyvariadic.Return buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)]) => Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs (Servant.API.QueryParam.QueryParams sym x : cs) verb) m
- Servant.Hateoas.Layer.Build: instance (c GHC.Types.~ Servant.Hateoas.Layer.Type.MkPrefix (apiCs Servant.Hateoas.Layer.Type.++ '[Servant.API.QueryString.DeepQuery sym x]) verb, Servant.Hateoas.RelationLink.HasRelationLink c, GHC.TypeLits.KnownSymbol sym, Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs cs verb) m, buildLinksFun GHC.Types.~ Servant.Hateoas.Layer.Build.ReplaceHandler (Servant.Server.Internal.ServerT (Servant.Hateoas.Layer.Type.MkPrefix apiCs verb) m) [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)], Servant.Hateoas.Internal.Polyvariadic.PolyvariadicComp buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun), Servant.Hateoas.Internal.Polyvariadic.Replace buildLinksFun [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)] (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ buildLinksFun, Servant.Hateoas.Internal.Polyvariadic.Return buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)]) => Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs (Servant.API.QueryString.DeepQuery sym x : cs) verb) m
+ Servant.Hateoas.Layer.Build: instance forall k verb (method :: k) (status :: GHC.TypeNats.Nat) (cts :: [*]) a api (apiCs :: [*]) (sym :: GHC.Types.Symbol) (cs :: [*]) (m :: * -> *) buildLinksFun. (verb GHC.Types.~ Servant.API.Verbs.Verb method status cts a, Servant.API.ContentTypes.AllMime cts, Servant.API.Verbs.ReflectMethod method, api GHC.Types.~ Servant.Hateoas.Layer.Type.MkPrefix apiCs verb, GHC.TypeLits.KnownSymbol sym, Servant.Hateoas.RelationLink.HasRelationLink (Servant.Hateoas.Layer.Type.MkPrefix '[Servant.API.QueryParam.QueryFlag sym] verb), Servant.API.TypeLevel.IsElem api api, Servant.Links.HasLink api, Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs cs verb) m, buildLinksFun GHC.Types.~ Servant.Hateoas.Layer.Build.ReplaceHandler (Servant.Server.Internal.ServerT api m) [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)], Servant.Hateoas.Internal.Polyvariadic.PolyvariadicComp2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun), Servant.Hateoas.Internal.Polyvariadic.Return2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ (Servant.Links.Link, [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)]), Servant.Hateoas.Internal.Polyvariadic.Replace2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)] (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ buildLinksFun) => Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs (Servant.API.QueryParam.QueryFlag sym : cs) verb) m
+ Servant.Hateoas.Layer.Build: instance forall k verb (method :: k) (status :: GHC.TypeNats.Nat) (cts :: [*]) a api (apiCs :: [*]) (sym :: GHC.Types.Symbol) (mods :: [*]) x (cs :: [*]) (m :: * -> *) buildLinksFun. (verb GHC.Types.~ Servant.API.Verbs.Verb method status cts a, Servant.API.ContentTypes.AllMime cts, Servant.API.Verbs.ReflectMethod method, api GHC.Types.~ Servant.Hateoas.Layer.Type.MkPrefix apiCs verb, GHC.TypeLits.KnownSymbol sym, Servant.Hateoas.RelationLink.HasRelationLink (Servant.Hateoas.Layer.Type.MkPrefix '[Servant.API.Capture.Capture' mods sym x] verb), Servant.API.TypeLevel.IsElem api api, Servant.Links.HasLink api, Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs cs verb) m, buildLinksFun GHC.Types.~ Servant.Hateoas.Layer.Build.ReplaceHandler (Servant.Server.Internal.ServerT api m) [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)], Servant.Hateoas.Internal.Polyvariadic.PolyvariadicComp2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun), Servant.Hateoas.Internal.Polyvariadic.Return2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ (Servant.Links.Link, [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)]), Servant.Hateoas.Internal.Polyvariadic.Replace2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)] (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ buildLinksFun) => Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs (Servant.API.Capture.Capture' mods sym x : cs) verb) m
+ Servant.Hateoas.Layer.Build: instance forall k verb (method :: k) (status :: GHC.TypeNats.Nat) (cts :: [*]) a api (apiCs :: [*]) (sym :: GHC.Types.Symbol) (mods :: [*]) x (cs :: [*]) (m :: * -> *) buildLinksFun. (verb GHC.Types.~ Servant.API.Verbs.Verb method status cts a, Servant.API.ContentTypes.AllMime cts, Servant.API.Verbs.ReflectMethod method, api GHC.Types.~ Servant.Hateoas.Layer.Type.MkPrefix apiCs verb, GHC.TypeLits.KnownSymbol sym, Servant.Hateoas.RelationLink.HasRelationLink (Servant.Hateoas.Layer.Type.MkPrefix '[Servant.API.QueryParam.QueryParam' mods sym x] verb), Servant.API.TypeLevel.IsElem api api, Servant.Links.HasLink api, Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs cs verb) m, buildLinksFun GHC.Types.~ Servant.Hateoas.Layer.Build.ReplaceHandler (Servant.Server.Internal.ServerT api m) [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)], Servant.Hateoas.Internal.Polyvariadic.PolyvariadicComp2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun), Servant.Hateoas.Internal.Polyvariadic.Return2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ (Servant.Links.Link, [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)]), Servant.Hateoas.Internal.Polyvariadic.Replace2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)] (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ buildLinksFun) => Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs (Servant.API.QueryParam.QueryParam' mods sym x : cs) verb) m
+ Servant.Hateoas.Layer.Build: instance forall k verb (method :: k) (status :: GHC.TypeNats.Nat) (cts :: [*]) a api (apiCs :: [*]) (sym :: GHC.Types.Symbol) x (cs :: [*]) (m :: * -> *) buildLinksFun. (verb GHC.Types.~ Servant.API.Verbs.Verb method status cts a, Servant.API.ContentTypes.AllMime cts, Servant.API.Verbs.ReflectMethod method, api GHC.Types.~ Servant.Hateoas.Layer.Type.MkPrefix apiCs verb, GHC.TypeLits.KnownSymbol sym, Servant.Hateoas.RelationLink.HasRelationLink (Servant.Hateoas.Layer.Type.MkPrefix '[Servant.API.Capture.CaptureAll sym x] verb), Servant.API.TypeLevel.IsElem api api, Servant.Links.HasLink api, Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs cs verb) m, buildLinksFun GHC.Types.~ Servant.Hateoas.Layer.Build.ReplaceHandler (Servant.Server.Internal.ServerT api m) [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)], Servant.Hateoas.Internal.Polyvariadic.PolyvariadicComp2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun), Servant.Hateoas.Internal.Polyvariadic.Return2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ (Servant.Links.Link, [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)]), Servant.Hateoas.Internal.Polyvariadic.Replace2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)] (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ buildLinksFun) => Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs (Servant.API.Capture.CaptureAll sym x : cs) verb) m
+ Servant.Hateoas.Layer.Build: instance forall k verb (method :: k) (status :: GHC.TypeNats.Nat) (cts :: [*]) a api (apiCs :: [*]) (sym :: GHC.Types.Symbol) x (cs :: [*]) (m :: * -> *) buildLinksFun. (verb GHC.Types.~ Servant.API.Verbs.Verb method status cts a, Servant.API.ContentTypes.AllMime cts, Servant.API.Verbs.ReflectMethod method, api GHC.Types.~ Servant.Hateoas.Layer.Type.MkPrefix apiCs verb, GHC.TypeLits.KnownSymbol sym, Servant.Hateoas.RelationLink.HasRelationLink (Servant.Hateoas.Layer.Type.MkPrefix '[Servant.API.QueryParam.QueryParams sym x] verb), Servant.API.TypeLevel.IsElem api api, Servant.Links.HasLink api, Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs cs verb) m, buildLinksFun GHC.Types.~ Servant.Hateoas.Layer.Build.ReplaceHandler (Servant.Server.Internal.ServerT api m) [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)], Servant.Hateoas.Internal.Polyvariadic.PolyvariadicComp2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun), Servant.Hateoas.Internal.Polyvariadic.Return2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ (Servant.Links.Link, [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)]), Servant.Hateoas.Internal.Polyvariadic.Replace2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)] (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ buildLinksFun) => Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs (Servant.API.QueryParam.QueryParams sym x : cs) verb) m
+ Servant.Hateoas.Layer.Build: instance forall k verb (method :: k) (status :: GHC.TypeNats.Nat) (cts :: [*]) a api (apiCs :: [*]) (sym :: GHC.Types.Symbol) x (cs :: [*]) (m :: * -> *) buildLinksFun. (verb GHC.Types.~ Servant.API.Verbs.Verb method status cts a, Servant.API.ContentTypes.AllMime cts, Servant.API.Verbs.ReflectMethod method, api GHC.Types.~ Servant.Hateoas.Layer.Type.MkPrefix apiCs verb, GHC.TypeLits.KnownSymbol sym, Servant.Hateoas.RelationLink.HasRelationLink (Servant.Hateoas.Layer.Type.MkPrefix '[Servant.API.QueryString.DeepQuery sym x] verb), Servant.API.TypeLevel.IsElem api api, Servant.Links.HasLink api, Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs cs verb) m, buildLinksFun GHC.Types.~ Servant.Hateoas.Layer.Build.ReplaceHandler (Servant.Server.Internal.ServerT api m) [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)], Servant.Hateoas.Internal.Polyvariadic.PolyvariadicComp2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun), Servant.Hateoas.Internal.Polyvariadic.Return2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ (Servant.Links.Link, [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)]), Servant.Hateoas.Internal.Polyvariadic.Replace2 (Servant.Links.MkLink api Servant.Links.Link) buildLinksFun [(GHC.Base.String, Servant.Hateoas.Resource.ResourceLink)] (Servant.Hateoas.Internal.Polyvariadic.IsFun buildLinksFun) GHC.Types.~ buildLinksFun) => Servant.Hateoas.Layer.Build.BuildLayerLinks ('Servant.Hateoas.Layer.Type.Layer apiCs (Servant.API.QueryString.DeepQuery sym x : cs) verb) m
+ Servant.Hateoas.RelationLink: fromURI :: [MediaType] -> StdMethod -> URI -> RelationLink
+ Servant.Hateoas.RelationLink: reflectStdMethod :: ReflectMethod method => Proxy method -> StdMethod

Files

CHANGELOG.md view
@@ -6,6 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [PVP versioning](https://pvp.haskell.org/). +## v0.3.3 _(2024-12-28)_++### Added+- Added function `fromURI` for creating `RelationLink` from an `URI`++### Changed+- Replaced fully templated links with partially templated links for layers whose endpoints take arguments+ ## v0.3.2 _(2024-12-27)_  ### Changed
servant-hateoas.cabal view
@@ -1,6 +1,6 @@ cabal-version:           3.0 name:                    servant-hateoas-version:                 0.3.2+version:                 0.3.3 synopsis:                HATEOAS extension for servant description:             Create Resource-Representations for your types and make your API HATEOAS-compliant.   Automatically derive a HATEOAS-API and server-implementation from your API or straight up define a HATEOAS-API yourself.@@ -52,6 +52,7 @@                        , text                          >= 1.2.3.0  && < 2.2                        , http-types                    >= 0.12.2   && < 0.13                        , http-media                    >= 0.8.1    && < 0.9+                       , network-uri                   >= 2.6.1.0  && < 2.7                        , servant                       >= 0.20.2   && < 0.21                        , servant-server                >= 0.20.2   && < 0.21                        , singleton-bool                >= 0.1.4    && < 0.2
src/Servant/Hateoas/Layer/Build.hs view
@@ -11,6 +11,7 @@ where  import Servant+import Servant.API.ContentTypes import Servant.Hateoas.Resource import Servant.Hateoas.RelationLink import Servant.Hateoas.Layer.Type@@ -60,97 +61,145 @@       mkLinks = buildLayerLinks (Proxy @('Layer apiCs cs verb)) m  instance-  ( c ~ MkPrefix (apiCs ++ '[Capture' mods sym x]) verb-  , HasRelationLink c+  ( verb ~ Verb method status cts a+  , AllMime cts, ReflectMethod method+  , api ~ MkPrefix apiCs verb   , KnownSymbol sym+  , HasRelationLink (MkPrefix '[Capture' mods sym x] verb)+  , IsElem api api, HasLink api   , BuildLayerLinks ('Layer apiCs cs verb) m-  , buildLinksFun ~ (ReplaceHandler (ServerT (MkPrefix apiCs verb) m) [(String, ResourceLink)])-  , PolyvariadicComp buildLinksFun (IsFun buildLinksFun)-  , Replace buildLinksFun [(String, ResourceLink)] (IsFun buildLinksFun) ~ buildLinksFun-  , Return buildLinksFun (IsFun buildLinksFun) ~ [(String, ResourceLink)]+  , buildLinksFun ~ (ReplaceHandler (ServerT api m) [(String, ResourceLink)])+  , PolyvariadicComp2 (MkLink api Link) buildLinksFun (IsFun buildLinksFun)+  , Return2 (MkLink api Link) buildLinksFun (IsFun buildLinksFun) ~ (Link, [(String, ResourceLink)])+  , Replace2 (MkLink api Link) buildLinksFun [(String, ResourceLink)] (IsFun buildLinksFun) ~ buildLinksFun   ) => BuildLayerLinks ('Layer apiCs (Capture' mods sym x ': cs) verb) m where-  buildLayerLinks _ m = ((relName, l) :) ... mkLinks+  buildLayerLinks _ m = pcomp2 (\(self, ls) -> (relName, mkTemplatedNext self) : ls) mkSelf mkLinks     where-      mkLinks = buildLayerLinks (Proxy @('Layer apiCs cs verb)) m       relName = symbolVal (Proxy @sym)-      l = TemplateLink $ toRelationLink (Proxy @c)+      mkSelf = safeLink (Proxy @api) (Proxy @api)+      mkLinks = buildLayerLinks (Proxy @('Layer apiCs cs verb)) m+      child = toRelationLink (Proxy @(MkPrefix '[Capture' mods sym x] verb))+      mkTemplatedNext = TemplateLink+        . (\rl -> rl { _path = _path rl `appendPath` _path child, _templated = True })+        . fromURI (allMime $ Proxy @cts) (reflectStdMethod (Proxy @method))+        . linkURI  instance-  ( c ~ MkPrefix (apiCs ++ '[CaptureAll sym x]) verb-  , HasRelationLink c+  ( verb ~ Verb method status cts a+  , AllMime cts, ReflectMethod method+  , api ~ MkPrefix apiCs verb   , KnownSymbol sym+  , HasRelationLink (MkPrefix '[CaptureAll sym x] verb)+  , IsElem api api, HasLink api   , BuildLayerLinks ('Layer apiCs cs verb) m-  , buildLinksFun ~ (ReplaceHandler (ServerT (MkPrefix apiCs verb) m) [(String, ResourceLink)])-  , PolyvariadicComp buildLinksFun (IsFun buildLinksFun)-  , Replace buildLinksFun [(String, ResourceLink)] (IsFun buildLinksFun) ~ buildLinksFun-  , Return buildLinksFun (IsFun buildLinksFun) ~ [(String, ResourceLink)]+  , buildLinksFun ~ (ReplaceHandler (ServerT api m) [(String, ResourceLink)])+  , PolyvariadicComp2 (MkLink api Link) buildLinksFun (IsFun buildLinksFun)+  , Return2 (MkLink api Link) buildLinksFun (IsFun buildLinksFun) ~ (Link, [(String, ResourceLink)])+  , Replace2 (MkLink api Link) buildLinksFun [(String, ResourceLink)] (IsFun buildLinksFun) ~ buildLinksFun   ) => BuildLayerLinks ('Layer apiCs (CaptureAll sym x ': cs) verb) m where-  buildLayerLinks _ m = ((relName, l) :) ... mkLinks+  buildLayerLinks _ m = pcomp2 (\(self, ls) -> (relName, mkTemplatedNext self) : ls) mkSelf mkLinks     where-      mkLinks = buildLayerLinks (Proxy @('Layer apiCs cs verb)) m       relName = symbolVal (Proxy @sym)-      l = TemplateLink $ toRelationLink (Proxy @c)+      mkSelf = safeLink (Proxy @api) (Proxy @api)+      mkLinks = buildLayerLinks (Proxy @('Layer apiCs cs verb)) m+      child = toRelationLink (Proxy @(MkPrefix '[CaptureAll sym x] verb))+      mkTemplatedNext = TemplateLink+        . (\rl -> rl { _path = _path rl `appendPath` _path child, _templated = True })+        . fromURI (allMime $ Proxy @cts) (reflectStdMethod (Proxy @method))+        . linkURI  instance-  ( c ~ MkPrefix (apiCs ++ '[QueryParam' mods sym x]) verb-  , HasRelationLink c+  ( verb ~ Verb method status cts a+  , AllMime cts, ReflectMethod method+  , api ~ MkPrefix apiCs verb   , KnownSymbol sym+  , HasRelationLink (MkPrefix '[QueryParam' mods sym x] verb)+  , IsElem api api, HasLink api   , BuildLayerLinks ('Layer apiCs cs verb) m-  , buildLinksFun ~ (ReplaceHandler (ServerT (MkPrefix apiCs verb) m) [(String, ResourceLink)])-  , PolyvariadicComp buildLinksFun (IsFun buildLinksFun)-  , Replace buildLinksFun [(String, ResourceLink)] (IsFun buildLinksFun) ~ buildLinksFun-  , Return buildLinksFun (IsFun buildLinksFun) ~ [(String, ResourceLink)]+  , buildLinksFun ~ (ReplaceHandler (ServerT api m) [(String, ResourceLink)])+  , PolyvariadicComp2 (MkLink api Link) buildLinksFun (IsFun buildLinksFun)+  , Return2 (MkLink api Link) buildLinksFun (IsFun buildLinksFun) ~ (Link, [(String, ResourceLink)])+  , Replace2 (MkLink api Link) buildLinksFun [(String, ResourceLink)] (IsFun buildLinksFun) ~ buildLinksFun   ) => BuildLayerLinks ('Layer apiCs (QueryParam' mods sym x ': cs) verb) m where-  buildLayerLinks _ m = ((relName, l) :) ... mkLinks+  buildLayerLinks _ m = pcomp2 (\(self, ls) -> (relName, mkTemplatedNext self) : ls) mkSelf mkLinks     where-      mkLinks = buildLayerLinks (Proxy @('Layer apiCs cs verb)) m       relName = symbolVal (Proxy @sym)-      l = TemplateLink $ toRelationLink (Proxy @c)+      mkSelf = safeLink (Proxy @api) (Proxy @api)+      mkLinks = buildLayerLinks (Proxy @('Layer apiCs cs verb)) m+      child = toRelationLink (Proxy @(MkPrefix '[QueryParam' mods sym x] verb))+      mkTemplatedNext = TemplateLink+        . (\rl -> rl { _params = _params rl ++ _params child, _templated = True })+        . fromURI (allMime $ Proxy @cts) (reflectStdMethod (Proxy @method))+        . linkURI  instance-  ( c ~ MkPrefix (apiCs ++ '[QueryParams sym x]) verb-  , HasRelationLink c+  ( verb ~ Verb method status cts a+  , AllMime cts, ReflectMethod method+  , api ~ MkPrefix apiCs verb   , KnownSymbol sym+  , HasRelationLink (MkPrefix '[QueryParams sym x] verb)+  , IsElem api api, HasLink api   , BuildLayerLinks ('Layer apiCs cs verb) m-  , buildLinksFun ~ (ReplaceHandler (ServerT (MkPrefix apiCs verb) m) [(String, ResourceLink)])-  , PolyvariadicComp buildLinksFun (IsFun buildLinksFun)-  , Replace buildLinksFun [(String, ResourceLink)] (IsFun buildLinksFun) ~ buildLinksFun-  , Return buildLinksFun (IsFun buildLinksFun) ~ [(String, ResourceLink)]+  , buildLinksFun ~ (ReplaceHandler (ServerT api m) [(String, ResourceLink)])+  , PolyvariadicComp2 (MkLink api Link) buildLinksFun (IsFun buildLinksFun)+  , Return2 (MkLink api Link) buildLinksFun (IsFun buildLinksFun) ~ (Link, [(String, ResourceLink)])+  , Replace2 (MkLink api Link) buildLinksFun [(String, ResourceLink)] (IsFun buildLinksFun) ~ buildLinksFun   ) => BuildLayerLinks ('Layer apiCs (QueryParams sym x ': cs) verb) m where-  buildLayerLinks _ m = ((relName, l) :) ... mkLinks+  buildLayerLinks _ m = pcomp2 (\(self, ls) -> (relName, mkTemplatedNext self) : ls) mkSelf mkLinks     where-      mkLinks = buildLayerLinks (Proxy @('Layer apiCs cs verb)) m       relName = symbolVal (Proxy @sym)-      l = TemplateLink $ toRelationLink (Proxy @c)+      mkSelf = safeLink (Proxy @api) (Proxy @api)+      mkLinks = buildLayerLinks (Proxy @('Layer apiCs cs verb)) m+      child = toRelationLink (Proxy @(MkPrefix '[QueryParams sym x] verb))+      mkTemplatedNext = TemplateLink+        . (\rl -> rl { _params = _params rl ++ _params child, _templated = True })+        . fromURI (allMime $ Proxy @cts) (reflectStdMethod (Proxy @method))+        . linkURI  instance-  ( c ~ MkPrefix (apiCs ++ '[DeepQuery sym x]) verb-  , HasRelationLink c+  ( verb ~ Verb method status cts a+  , AllMime cts, ReflectMethod method+  , api ~ MkPrefix apiCs verb   , KnownSymbol sym+  , HasRelationLink (MkPrefix '[DeepQuery sym x] verb)+  , IsElem api api, HasLink api   , BuildLayerLinks ('Layer apiCs cs verb) m-  , buildLinksFun ~ (ReplaceHandler (ServerT (MkPrefix apiCs verb) m) [(String, ResourceLink)])-  , PolyvariadicComp buildLinksFun (IsFun buildLinksFun)-  , Replace buildLinksFun [(String, ResourceLink)] (IsFun buildLinksFun) ~ buildLinksFun-  , Return buildLinksFun (IsFun buildLinksFun) ~ [(String, ResourceLink)]+  , buildLinksFun ~ (ReplaceHandler (ServerT api m) [(String, ResourceLink)])+  , PolyvariadicComp2 (MkLink api Link) buildLinksFun (IsFun buildLinksFun)+  , Return2 (MkLink api Link) buildLinksFun (IsFun buildLinksFun) ~ (Link, [(String, ResourceLink)])+  , Replace2 (MkLink api Link) buildLinksFun [(String, ResourceLink)] (IsFun buildLinksFun) ~ buildLinksFun   ) => BuildLayerLinks ('Layer apiCs (DeepQuery sym x ': cs) verb) m where-  buildLayerLinks _ m = ((relName, l) :) ... mkLinks+  buildLayerLinks _ m = pcomp2 (\(self, ls) -> (relName, mkTemplatedNext self) : ls) mkSelf mkLinks     where-      mkLinks = buildLayerLinks (Proxy @('Layer apiCs cs verb)) m       relName = symbolVal (Proxy @sym)-      l = TemplateLink $ toRelationLink (Proxy @c)+      mkSelf = safeLink (Proxy @api) (Proxy @api)+      mkLinks = buildLayerLinks (Proxy @('Layer apiCs cs verb)) m+      child = toRelationLink (Proxy @(MkPrefix '[DeepQuery sym x] verb))+      mkTemplatedNext = TemplateLink+        . (\rl -> rl { _params = _params rl ++ _params child, _templated = True })+        . fromURI (allMime $ Proxy @cts) (reflectStdMethod (Proxy @method))+        . linkURI  instance-  ( c ~ MkPrefix (apiCs ++ '[QueryFlag sym]) verb-  , HasRelationLink c+  ( verb ~ Verb method status cts a+  , AllMime cts, ReflectMethod method+  , api ~ MkPrefix apiCs verb   , KnownSymbol sym+  , HasRelationLink (MkPrefix '[QueryFlag sym] verb)+  , IsElem api api, HasLink api   , BuildLayerLinks ('Layer apiCs cs verb) m-  , buildLinksFun ~ (ReplaceHandler (ServerT (MkPrefix apiCs verb) m) [(String, ResourceLink)])-  , PolyvariadicComp buildLinksFun (IsFun buildLinksFun)-  , Replace buildLinksFun [(String, ResourceLink)] (IsFun buildLinksFun) ~ buildLinksFun-  , Return buildLinksFun (IsFun buildLinksFun) ~ [(String, ResourceLink)]+  , buildLinksFun ~ (ReplaceHandler (ServerT api m) [(String, ResourceLink)])+  , PolyvariadicComp2 (MkLink api Link) buildLinksFun (IsFun buildLinksFun)+  , Return2 (MkLink api Link) buildLinksFun (IsFun buildLinksFun) ~ (Link, [(String, ResourceLink)])+  , Replace2 (MkLink api Link) buildLinksFun [(String, ResourceLink)] (IsFun buildLinksFun) ~ buildLinksFun   ) => BuildLayerLinks ('Layer apiCs (QueryFlag sym ': cs) verb) m where-  buildLayerLinks _ m = ((relName, l) :) ... mkLinks+  buildLayerLinks _ m = pcomp2 (\(self, ls) -> (relName, mkTemplatedNext self) : ls) mkSelf mkLinks     where-      mkLinks = buildLayerLinks (Proxy @('Layer apiCs cs verb)) m       relName = symbolVal (Proxy @sym)-      l = TemplateLink $ toRelationLink (Proxy @c)+      mkSelf = safeLink (Proxy @api) (Proxy @api)+      mkLinks = buildLayerLinks (Proxy @('Layer apiCs cs verb)) m+      child = toRelationLink (Proxy @(MkPrefix '[QueryFlag sym] verb))+      mkTemplatedNext = TemplateLink+        . (\rl -> rl { _params = _params rl ++ _params child, _templated = True })+        . fromURI (allMime $ Proxy @cts) (reflectStdMethod (Proxy @method))+        . linkURI
src/Servant/Hateoas/RelationLink.hs view
@@ -1,27 +1,40 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE ViewPatterns #-}  module Servant.Hateoas.RelationLink (-  -- * Type+  -- * RelationLink+  -- ** Type   RelationLink(..),   RelationParam(..),++  -- *** Creation+  fromURI,++  -- *** Operations   mkPlaceHolder,   appendPath, -  -- * Class+  -- ** Class   HasRelationLink(..),++  -- * Utility+  -- ** ReflectStdMethod+  reflectStdMethod, ) where +import Prelude hiding (dropWhile, break) import Servant import Servant.API.ContentTypes (AllMime(..)) import Servant.API.Modifiers (FoldRequired)+import Network.URI (unEscapeString) import Network.HTTP.Media (MediaType)-import Network.HTTP.Types (parseMethod)+import Network.HTTP.Types (parseMethod, Method) import Data.String (fromString) import Data.Aeson-import Data.Text (Text, intercalate)+import Data.Text (Text, intercalate, dropWhile, split, break) import Data.Singletons.Bool import GHC.TypeLits @@ -51,6 +64,33 @@ appendPath l "" = l appendPath l r = l <> "/" <> r +-- | Creates a 'RelationLink' from an 'URI'.+fromURI :: [MediaType] -> StdMethod -> URI -> RelationLink+fromURI cts m (URI _ _ path query _) = RelationLink+  { _path = fromString path+  , _params = params+  , _templated = False+  , _method = m+  , _contentTypes = cts+  , _summary = Nothing+  , _description = Nothing+  }+  where+    params = filter ((/= "") . _name)+      $ fmap (\kv -> RelationParam (fst $ break (== '=') kv) False)+      $ split (== '&')+      $ dropWhile (== '?')+      $ fromString+      $ unEscapeString query++-- | Like 'reflectMethod' but returns a 'StdMethod'.+reflectStdMethod :: ReflectMethod method => Proxy method -> StdMethod+reflectStdMethod = unsafeMethodToStdMethod . reflectMethod++unsafeMethodToStdMethod :: Method -> StdMethod+unsafeMethodToStdMethod (parseMethod -> Right m) = m+unsafeMethodToStdMethod (parseMethod -> Left  m) = error $ "Cannot convert " <> show m <> " to StdMethod"+ instance ToJSON RelationLink where   toJSON (RelationLink path params templated _ _ _ _) = String $     if not (null params) && templated@@ -146,7 +186,7 @@     { _path = mempty     , _params = []     , _templated = False-    , _method = case parseMethod $ reflectMethod (Proxy @m) of Right m -> m; Left _ -> error "Invalid method"+    , _method = reflectStdMethod (Proxy @m)     , _summary = Nothing     , _description = Nothing     , _contentTypes = allMime (Proxy @cts)@@ -157,7 +197,7 @@     { _path = mempty     , _params = []     , _templated = False-    , _method = case parseMethod $ reflectMethod (Proxy @m) of Right m -> m; Left _ -> error "Invalid method"+    , _method = reflectStdMethod (Proxy @m)     , _summary = Nothing     , _description = Nothing     , _contentTypes = mempty@@ -168,7 +208,7 @@     { _path = mempty     , _params = []     , _templated = False-    , _method = case parseMethod $ reflectMethod (Proxy @m) of Right m -> m; Left _ -> error "Invalid method"+    , _method = reflectStdMethod (Proxy @m)     , _summary = Nothing     , _description = Nothing     , _contentTypes = allMime (Proxy @cts)@@ -179,7 +219,7 @@     { _path = mempty     , _params = []     , _templated = False-    , _method = case parseMethod $ reflectMethod (Proxy @m) of Right m -> m; Left _ -> error "Invalid method"+    , _method = reflectStdMethod (Proxy @m)     , _summary = Nothing     , _description = Nothing     , _contentTypes = pure $ contentType (Proxy @ct)