{-# LANGUAGE UndecidableInstances #-}
module Servant.Hateoas.Layer.Build
(
ReplaceHandler,
BuildLayerLinks(..),
)
where
import Servant
import Servant.API.ContentTypes
import Servant.Hateoas.RelationLink
import Servant.Hateoas.Layer.Type
import Servant.Hateoas.Internal.Sym
import Servant.Hateoas.Internal.Polyvariadic
import Data.Kind
import Control.Monad.IO.Class
import GHC.TypeLits
type family ReplaceHandler server replacement where
ReplaceHandler (a :<|> b) replacement = ReplaceHandler a replacement :<|> ReplaceHandler b replacement
ReplaceHandler (a -> b) replacement = a -> ReplaceHandler b replacement
ReplaceHandler _ replacement = replacement
type BuildLayerLinks :: Layer -> (Type -> Type) -> Constraint
class BuildLayerLinks l m where
buildLayerLinks :: MonadIO m => Proxy l -> Proxy m -> ReplaceHandler (ServerT l m) [(String, RelationLink)]
instance
( api ~ MkPrefix apiCs verb
, HasRelationLink api
, mkSelf ~ MkLink api RelationLink
, PolyvariadicComp mkSelf (IsFun mkSelf)
, Return mkSelf (IsFun mkSelf) ~ RelationLink
, Replace mkSelf [(String, RelationLink)] (IsFun mkSelf) ~ ReplaceHandler (ServerT api m) [(String, RelationLink)]
) => BuildLayerLinks ('Layer apiCs '[] verb) m where
buildLayerLinks :: MonadIO m =>
Proxy ('Layer apiCs '[] verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs '[] verb) m) [(String, RelationLink)]
buildLayerLinks Proxy ('Layer apiCs '[] verb)
_ Proxy m
_ = (forall (f :: * -> *) a. Applicative f => a -> f a
pure @[] ((String, Return mkSelf (IsFun mkSelf))
-> [(String, Return mkSelf (IsFun mkSelf))])
-> (Return mkSelf (IsFun mkSelf)
-> (String, Return mkSelf (IsFun mkSelf)))
-> Return mkSelf (IsFun mkSelf)
-> [(String, Return mkSelf (IsFun mkSelf))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"self", )) (Return mkSelf (IsFun mkSelf)
-> [(String, Return mkSelf (IsFun mkSelf))])
-> mkSelf
-> Replace
mkSelf [(String, Return mkSelf (IsFun mkSelf))] (IsFun mkSelf)
forall f (b :: Bool) r.
(PolyvariadicComp f b, IsFun f ~ b) =>
(Return f b -> r) -> f -> Replace f r b
... mkSelf
MkLink api RelationLink
mkSelf
where
mkSelf :: MkLink api RelationLink
mkSelf = Proxy api -> MkLink api RelationLink
forall {k} (endpoint :: k).
HasRelationLink endpoint =>
Proxy endpoint -> MkLink endpoint RelationLink
toRelationLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @api)
instance
( c ~ MkPrefix (apiCs ++ '[Sym sym]) verb
, HasRelationLink c
, mkLink ~ MkLink c RelationLink
, KnownSymbol sym
, BuildLayerLinks ('Layer apiCs cs verb) m
, buildLinksFun ~ (ReplaceHandler (ServerT (MkPrefix apiCs verb) m) [(String, RelationLink)])
, PolyvariadicComp2 mkLink buildLinksFun (IsFun mkLink)
, Return2 mkLink buildLinksFun (IsFun mkLink) ~ (RelationLink, [(String, RelationLink)])
, Replace2 mkLink buildLinksFun [(String, RelationLink)] (IsFun mkLink) ~ buildLinksFun
) => BuildLayerLinks ('Layer apiCs (Sym sym ': cs) verb) m where
buildLayerLinks :: MonadIO m =>
Proxy ('Layer apiCs (Sym sym : cs) verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs (Sym sym : cs) verb) m)
[(String, RelationLink)]
buildLayerLinks Proxy ('Layer apiCs (Sym sym : cs) verb)
_ Proxy m
m = (Return2 mkLink buildLinksFun (IsFun buildLinksFun)
-> [(String, RelationLink)])
-> mkLink
-> buildLinksFun
-> Replace2
mkLink buildLinksFun [(String, RelationLink)] (IsFun buildLinksFun)
forall r.
(Return2 mkLink buildLinksFun (IsFun buildLinksFun) -> r)
-> mkLink
-> buildLinksFun
-> Replace2 mkLink buildLinksFun r (IsFun buildLinksFun)
forall f g (b :: Bool) r.
PolyvariadicComp2 f g b =>
(Return2 f g b -> r) -> f -> g -> Replace2 f g r b
pcomp2 (\(RelationLink
l, [(String, RelationLink)]
ls) -> (Proxy sym -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (forall {k} (t :: k). Proxy t
forall (t :: Symbol). Proxy t
Proxy @sym), RelationLink
l) (String, RelationLink)
-> [(String, RelationLink)] -> [(String, RelationLink)]
forall a. a -> [a] -> [a]
: [(String, RelationLink)]
ls) mkLink
MkLink c RelationLink
mkLink buildLinksFun
ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks
where
mkLink :: MkLink c RelationLink
mkLink = Proxy c -> MkLink c RelationLink
forall {k} (endpoint :: k).
HasRelationLink endpoint =>
Proxy endpoint -> MkLink endpoint RelationLink
toRelationLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @c)
mkLinks :: ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks = Proxy ('Layer apiCs cs verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
forall (l :: Layer) (m :: * -> *).
(BuildLayerLinks l m, MonadIO m) =>
Proxy l
-> Proxy m -> ReplaceHandler (ServerT l m) [(String, RelationLink)]
buildLayerLinks (forall {k} (t :: k). Proxy t
forall (t :: Layer). Proxy t
Proxy @('Layer apiCs cs verb)) Proxy m
m
instance
( verb ~ Verb method status cts a
, AllMime cts, ReflectMethod method
, api ~ MkPrefix apiCs verb
, HasRelationLink api
, KnownSymbol sym
, HasTemplatedLink (MkPrefix '[Capture' mods sym x] verb)
, BuildLayerLinks ('Layer apiCs cs verb) m
, buildLinksFun ~ (ReplaceHandler (ServerT api m) [(String, RelationLink)])
, PolyvariadicComp2 (MkLink api RelationLink) buildLinksFun (IsFun buildLinksFun)
, Return2 (MkLink api RelationLink) buildLinksFun (IsFun buildLinksFun) ~ (RelationLink, [(String, RelationLink)])
, Replace2 (MkLink api RelationLink) buildLinksFun [(String, RelationLink)] (IsFun buildLinksFun) ~ buildLinksFun
) => BuildLayerLinks ('Layer apiCs (Capture' mods sym x ': cs) verb) m where
buildLayerLinks :: MonadIO m =>
Proxy ('Layer apiCs (Capture' mods sym x : cs) verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs (Capture' mods sym x : cs) verb) m)
[(String, RelationLink)]
buildLayerLinks Proxy ('Layer apiCs (Capture' mods sym x : cs) verb)
_ Proxy m
m = (Return2
(MkLink api RelationLink)
buildLinksFun
(IsFun (MkLink api RelationLink))
-> [(String, RelationLink)])
-> MkLink api RelationLink
-> buildLinksFun
-> Replace2
(MkLink api RelationLink)
buildLinksFun
[(String, RelationLink)]
(IsFun (MkLink api RelationLink))
forall r.
(Return2
(MkLink api RelationLink)
buildLinksFun
(IsFun (MkLink api RelationLink))
-> r)
-> MkLink api RelationLink
-> buildLinksFun
-> Replace2
(MkLink api RelationLink)
buildLinksFun
r
(IsFun (MkLink api RelationLink))
forall f g (b :: Bool) r.
PolyvariadicComp2 f g b =>
(Return2 f g b -> r) -> f -> g -> Replace2 f g r b
pcomp2 (\(RelationLink
self, [(String, RelationLink)]
ls) -> (String
relName, RelationLink
self RelationLink -> RelationLink -> RelationLink
<<< RelationLink
child) (String, RelationLink)
-> [(String, RelationLink)] -> [(String, RelationLink)]
forall a. a -> [a] -> [a]
: [(String, RelationLink)]
ls) MkLink api RelationLink
mkSelf buildLinksFun
ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks
where
relName :: String
relName = Proxy sym -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (forall {k} (t :: k). Proxy t
forall (t :: Symbol). Proxy t
Proxy @sym)
mkSelf :: MkLink api RelationLink
mkSelf = Proxy api -> MkLink api RelationLink
forall {k} (endpoint :: k).
HasRelationLink endpoint =>
Proxy endpoint -> MkLink endpoint RelationLink
toRelationLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @api)
mkLinks :: ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks = Proxy ('Layer apiCs cs verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
forall (l :: Layer) (m :: * -> *).
(BuildLayerLinks l m, MonadIO m) =>
Proxy l
-> Proxy m -> ReplaceHandler (ServerT l m) [(String, RelationLink)]
buildLayerLinks (forall {k} (t :: k). Proxy t
forall (t :: Layer). Proxy t
Proxy @('Layer apiCs cs verb)) Proxy m
m
child :: RelationLink
child = Proxy (Capture' mods sym x :> Verb method status cts a)
-> RelationLink
forall {k} (endpoint :: k).
HasTemplatedLink endpoint =>
Proxy endpoint -> RelationLink
toTemplatedLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @(MkPrefix '[Capture' mods sym x] verb))
instance
( verb ~ Verb method status cts a
, AllMime cts, ReflectMethod method
, api ~ MkPrefix apiCs verb
, HasRelationLink api
, KnownSymbol sym
, HasTemplatedLink (MkPrefix '[CaptureAll sym x] verb)
, BuildLayerLinks ('Layer apiCs cs verb) m
, buildLinksFun ~ (ReplaceHandler (ServerT api m) [(String, RelationLink)])
, PolyvariadicComp2 (MkLink api RelationLink) buildLinksFun (IsFun buildLinksFun)
, Return2 (MkLink api RelationLink) buildLinksFun (IsFun buildLinksFun) ~ (RelationLink, [(String, RelationLink)])
, Replace2 (MkLink api RelationLink) buildLinksFun [(String, RelationLink)] (IsFun buildLinksFun) ~ buildLinksFun
) => BuildLayerLinks ('Layer apiCs (CaptureAll sym x ': cs) verb) m where
buildLayerLinks :: MonadIO m =>
Proxy ('Layer apiCs (CaptureAll sym x : cs) verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs (CaptureAll sym x : cs) verb) m)
[(String, RelationLink)]
buildLayerLinks Proxy ('Layer apiCs (CaptureAll sym x : cs) verb)
_ Proxy m
m = (Return2
(MkLink api RelationLink)
buildLinksFun
(IsFun (MkLink api RelationLink))
-> [(String, RelationLink)])
-> MkLink api RelationLink
-> buildLinksFun
-> Replace2
(MkLink api RelationLink)
buildLinksFun
[(String, RelationLink)]
(IsFun (MkLink api RelationLink))
forall r.
(Return2
(MkLink api RelationLink)
buildLinksFun
(IsFun (MkLink api RelationLink))
-> r)
-> MkLink api RelationLink
-> buildLinksFun
-> Replace2
(MkLink api RelationLink)
buildLinksFun
r
(IsFun (MkLink api RelationLink))
forall f g (b :: Bool) r.
PolyvariadicComp2 f g b =>
(Return2 f g b -> r) -> f -> g -> Replace2 f g r b
pcomp2 (\(RelationLink
self, [(String, RelationLink)]
ls) -> (String
relName, RelationLink
self RelationLink -> RelationLink -> RelationLink
<<< RelationLink
child) (String, RelationLink)
-> [(String, RelationLink)] -> [(String, RelationLink)]
forall a. a -> [a] -> [a]
: [(String, RelationLink)]
ls) MkLink api RelationLink
mkSelf buildLinksFun
ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks
where
relName :: String
relName = Proxy sym -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (forall {k} (t :: k). Proxy t
forall (t :: Symbol). Proxy t
Proxy @sym)
mkSelf :: MkLink api RelationLink
mkSelf = Proxy api -> MkLink api RelationLink
forall {k} (endpoint :: k).
HasRelationLink endpoint =>
Proxy endpoint -> MkLink endpoint RelationLink
toRelationLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @api)
mkLinks :: ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks = Proxy ('Layer apiCs cs verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
forall (l :: Layer) (m :: * -> *).
(BuildLayerLinks l m, MonadIO m) =>
Proxy l
-> Proxy m -> ReplaceHandler (ServerT l m) [(String, RelationLink)]
buildLayerLinks (forall {k} (t :: k). Proxy t
forall (t :: Layer). Proxy t
Proxy @('Layer apiCs cs verb)) Proxy m
m
child :: RelationLink
child = Proxy (CaptureAll sym x :> Verb method status cts a)
-> RelationLink
forall {k} (endpoint :: k).
HasTemplatedLink endpoint =>
Proxy endpoint -> RelationLink
toTemplatedLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @(MkPrefix '[CaptureAll sym x] verb))
instance
( verb ~ Verb method status cts a
, AllMime cts, ReflectMethod method
, api ~ MkPrefix apiCs verb
, HasRelationLink api
, KnownSymbol sym
, HasTemplatedLink (MkPrefix '[QueryParam' mods sym x] verb)
, BuildLayerLinks ('Layer apiCs cs verb) m
, buildLinksFun ~ (ReplaceHandler (ServerT api m) [(String, RelationLink)])
, PolyvariadicComp2 (MkLink api RelationLink) buildLinksFun (IsFun buildLinksFun)
, Return2 (MkLink api RelationLink) buildLinksFun (IsFun buildLinksFun) ~ (RelationLink, [(String, RelationLink)])
, Replace2 (MkLink api RelationLink) buildLinksFun [(String, RelationLink)] (IsFun buildLinksFun) ~ buildLinksFun
) => BuildLayerLinks ('Layer apiCs (QueryParam' mods sym x ': cs) verb) m where
buildLayerLinks :: MonadIO m =>
Proxy ('Layer apiCs (QueryParam' mods sym x : cs) verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs (QueryParam' mods sym x : cs) verb) m)
[(String, RelationLink)]
buildLayerLinks Proxy ('Layer apiCs (QueryParam' mods sym x : cs) verb)
_ Proxy m
m = (Return2
(MkLink api RelationLink)
buildLinksFun
(IsFun (MkLink api RelationLink))
-> [(String, RelationLink)])
-> MkLink api RelationLink
-> buildLinksFun
-> Replace2
(MkLink api RelationLink)
buildLinksFun
[(String, RelationLink)]
(IsFun (MkLink api RelationLink))
forall r.
(Return2
(MkLink api RelationLink)
buildLinksFun
(IsFun (MkLink api RelationLink))
-> r)
-> MkLink api RelationLink
-> buildLinksFun
-> Replace2
(MkLink api RelationLink)
buildLinksFun
r
(IsFun (MkLink api RelationLink))
forall f g (b :: Bool) r.
PolyvariadicComp2 f g b =>
(Return2 f g b -> r) -> f -> g -> Replace2 f g r b
pcomp2 (\(RelationLink
self, [(String, RelationLink)]
ls) -> (String
relName, RelationLink
self RelationLink -> RelationLink -> RelationLink
<<< RelationLink
child) (String, RelationLink)
-> [(String, RelationLink)] -> [(String, RelationLink)]
forall a. a -> [a] -> [a]
: [(String, RelationLink)]
ls) MkLink api RelationLink
mkSelf buildLinksFun
ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks
where
relName :: String
relName = Proxy sym -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (forall {k} (t :: k). Proxy t
forall (t :: Symbol). Proxy t
Proxy @sym)
mkSelf :: MkLink api RelationLink
mkSelf = Proxy api -> MkLink api RelationLink
forall {k} (endpoint :: k).
HasRelationLink endpoint =>
Proxy endpoint -> MkLink endpoint RelationLink
toRelationLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @api)
mkLinks :: ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks = Proxy ('Layer apiCs cs verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
forall (l :: Layer) (m :: * -> *).
(BuildLayerLinks l m, MonadIO m) =>
Proxy l
-> Proxy m -> ReplaceHandler (ServerT l m) [(String, RelationLink)]
buildLayerLinks (forall {k} (t :: k). Proxy t
forall (t :: Layer). Proxy t
Proxy @('Layer apiCs cs verb)) Proxy m
m
child :: RelationLink
child = Proxy (QueryParam' mods sym x :> Verb method status cts a)
-> RelationLink
forall {k} (endpoint :: k).
HasTemplatedLink endpoint =>
Proxy endpoint -> RelationLink
toTemplatedLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @(MkPrefix '[QueryParam' mods sym x] verb))
instance
( verb ~ Verb method status cts a
, AllMime cts, ReflectMethod method
, api ~ MkPrefix apiCs verb
, HasRelationLink api
, KnownSymbol sym
, HasTemplatedLink (MkPrefix '[QueryParams sym x] verb)
, BuildLayerLinks ('Layer apiCs cs verb) m
, buildLinksFun ~ (ReplaceHandler (ServerT api m) [(String, RelationLink)])
, PolyvariadicComp2 (MkLink api RelationLink) buildLinksFun (IsFun buildLinksFun)
, Return2 (MkLink api RelationLink) buildLinksFun (IsFun buildLinksFun) ~ (RelationLink, [(String, RelationLink)])
, Replace2 (MkLink api RelationLink) buildLinksFun [(String, RelationLink)] (IsFun buildLinksFun) ~ buildLinksFun
) => BuildLayerLinks ('Layer apiCs (QueryParams sym x ': cs) verb) m where
buildLayerLinks :: MonadIO m =>
Proxy ('Layer apiCs (QueryParams sym x : cs) verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs (QueryParams sym x : cs) verb) m)
[(String, RelationLink)]
buildLayerLinks Proxy ('Layer apiCs (QueryParams sym x : cs) verb)
_ Proxy m
m = (Return2
(MkLink api RelationLink)
buildLinksFun
(IsFun (MkLink api RelationLink))
-> [(String, RelationLink)])
-> MkLink api RelationLink
-> buildLinksFun
-> Replace2
(MkLink api RelationLink)
buildLinksFun
[(String, RelationLink)]
(IsFun (MkLink api RelationLink))
forall r.
(Return2
(MkLink api RelationLink)
buildLinksFun
(IsFun (MkLink api RelationLink))
-> r)
-> MkLink api RelationLink
-> buildLinksFun
-> Replace2
(MkLink api RelationLink)
buildLinksFun
r
(IsFun (MkLink api RelationLink))
forall f g (b :: Bool) r.
PolyvariadicComp2 f g b =>
(Return2 f g b -> r) -> f -> g -> Replace2 f g r b
pcomp2 (\(RelationLink
self, [(String, RelationLink)]
ls) -> (String
relName, RelationLink
self RelationLink -> RelationLink -> RelationLink
<<< RelationLink
child) (String, RelationLink)
-> [(String, RelationLink)] -> [(String, RelationLink)]
forall a. a -> [a] -> [a]
: [(String, RelationLink)]
ls) MkLink api RelationLink
mkSelf buildLinksFun
ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks
where
relName :: String
relName = Proxy sym -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (forall {k} (t :: k). Proxy t
forall (t :: Symbol). Proxy t
Proxy @sym)
mkSelf :: MkLink api RelationLink
mkSelf = Proxy api -> MkLink api RelationLink
forall {k} (endpoint :: k).
HasRelationLink endpoint =>
Proxy endpoint -> MkLink endpoint RelationLink
toRelationLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @api)
mkLinks :: ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks = Proxy ('Layer apiCs cs verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
forall (l :: Layer) (m :: * -> *).
(BuildLayerLinks l m, MonadIO m) =>
Proxy l
-> Proxy m -> ReplaceHandler (ServerT l m) [(String, RelationLink)]
buildLayerLinks (forall {k} (t :: k). Proxy t
forall (t :: Layer). Proxy t
Proxy @('Layer apiCs cs verb)) Proxy m
m
child :: RelationLink
child = Proxy (QueryParams sym x :> Verb method status cts a)
-> RelationLink
forall {k} (endpoint :: k).
HasTemplatedLink endpoint =>
Proxy endpoint -> RelationLink
toTemplatedLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @(MkPrefix '[QueryParams sym x] verb))
instance
( verb ~ Verb method status cts a
, AllMime cts, ReflectMethod method
, api ~ MkPrefix apiCs verb
, HasRelationLink api
, KnownSymbol sym
, HasTemplatedLink (MkPrefix '[DeepQuery sym x] verb)
, BuildLayerLinks ('Layer apiCs cs verb) m
, buildLinksFun ~ (ReplaceHandler (ServerT api m) [(String, RelationLink)])
, PolyvariadicComp2 (MkLink api RelationLink) buildLinksFun (IsFun buildLinksFun)
, Return2 (MkLink api RelationLink) buildLinksFun (IsFun buildLinksFun) ~ (RelationLink, [(String, RelationLink)])
, Replace2 (MkLink api RelationLink) buildLinksFun [(String, RelationLink)] (IsFun buildLinksFun) ~ buildLinksFun
) => BuildLayerLinks ('Layer apiCs (DeepQuery sym x ': cs) verb) m where
buildLayerLinks :: MonadIO m =>
Proxy ('Layer apiCs (DeepQuery sym x : cs) verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs (DeepQuery sym x : cs) verb) m)
[(String, RelationLink)]
buildLayerLinks Proxy ('Layer apiCs (DeepQuery sym x : cs) verb)
_ Proxy m
m = (Return2
(MkLink api RelationLink)
buildLinksFun
(IsFun (MkLink api RelationLink))
-> [(String, RelationLink)])
-> MkLink api RelationLink
-> buildLinksFun
-> Replace2
(MkLink api RelationLink)
buildLinksFun
[(String, RelationLink)]
(IsFun (MkLink api RelationLink))
forall r.
(Return2
(MkLink api RelationLink)
buildLinksFun
(IsFun (MkLink api RelationLink))
-> r)
-> MkLink api RelationLink
-> buildLinksFun
-> Replace2
(MkLink api RelationLink)
buildLinksFun
r
(IsFun (MkLink api RelationLink))
forall f g (b :: Bool) r.
PolyvariadicComp2 f g b =>
(Return2 f g b -> r) -> f -> g -> Replace2 f g r b
pcomp2 (\(RelationLink
self, [(String, RelationLink)]
ls) -> (String
relName, RelationLink
self RelationLink -> RelationLink -> RelationLink
<<< RelationLink
child) (String, RelationLink)
-> [(String, RelationLink)] -> [(String, RelationLink)]
forall a. a -> [a] -> [a]
: [(String, RelationLink)]
ls) MkLink api RelationLink
mkSelf buildLinksFun
ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks
where
relName :: String
relName = Proxy sym -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (forall {k} (t :: k). Proxy t
forall (t :: Symbol). Proxy t
Proxy @sym)
mkSelf :: MkLink api RelationLink
mkSelf = Proxy api -> MkLink api RelationLink
forall {k} (endpoint :: k).
HasRelationLink endpoint =>
Proxy endpoint -> MkLink endpoint RelationLink
toRelationLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @api)
mkLinks :: ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks = Proxy ('Layer apiCs cs verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
forall (l :: Layer) (m :: * -> *).
(BuildLayerLinks l m, MonadIO m) =>
Proxy l
-> Proxy m -> ReplaceHandler (ServerT l m) [(String, RelationLink)]
buildLayerLinks (forall {k} (t :: k). Proxy t
forall (t :: Layer). Proxy t
Proxy @('Layer apiCs cs verb)) Proxy m
m
child :: RelationLink
child = Proxy (DeepQuery sym x :> Verb method status cts a) -> RelationLink
forall {k} (endpoint :: k).
HasTemplatedLink endpoint =>
Proxy endpoint -> RelationLink
toTemplatedLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @(MkPrefix '[DeepQuery sym x] verb))
instance
( verb ~ Verb method status cts a
, AllMime cts, ReflectMethod method
, api ~ MkPrefix apiCs verb
, HasRelationLink api
, KnownSymbol sym
, HasTemplatedLink (MkPrefix '[QueryFlag sym] verb)
, BuildLayerLinks ('Layer apiCs cs verb) m
, buildLinksFun ~ (ReplaceHandler (ServerT api m) [(String, RelationLink)])
, PolyvariadicComp2 (MkLink api RelationLink) buildLinksFun (IsFun buildLinksFun)
, Return2 (MkLink api RelationLink) buildLinksFun (IsFun buildLinksFun) ~ (RelationLink, [(String, RelationLink)])
, Replace2 (MkLink api RelationLink) buildLinksFun [(String, RelationLink)] (IsFun buildLinksFun) ~ buildLinksFun
) => BuildLayerLinks ('Layer apiCs (QueryFlag sym ': cs) verb) m where
buildLayerLinks :: MonadIO m =>
Proxy ('Layer apiCs (QueryFlag sym : cs) verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs (QueryFlag sym : cs) verb) m)
[(String, RelationLink)]
buildLayerLinks Proxy ('Layer apiCs (QueryFlag sym : cs) verb)
_ Proxy m
m = (Return2
(MkLink api RelationLink)
buildLinksFun
(IsFun (MkLink api RelationLink))
-> [(String, RelationLink)])
-> MkLink api RelationLink
-> buildLinksFun
-> Replace2
(MkLink api RelationLink)
buildLinksFun
[(String, RelationLink)]
(IsFun (MkLink api RelationLink))
forall r.
(Return2
(MkLink api RelationLink)
buildLinksFun
(IsFun (MkLink api RelationLink))
-> r)
-> MkLink api RelationLink
-> buildLinksFun
-> Replace2
(MkLink api RelationLink)
buildLinksFun
r
(IsFun (MkLink api RelationLink))
forall f g (b :: Bool) r.
PolyvariadicComp2 f g b =>
(Return2 f g b -> r) -> f -> g -> Replace2 f g r b
pcomp2 (\(RelationLink
self, [(String, RelationLink)]
ls) -> (String
relName, RelationLink
self RelationLink -> RelationLink -> RelationLink
<<< RelationLink
child) (String, RelationLink)
-> [(String, RelationLink)] -> [(String, RelationLink)]
forall a. a -> [a] -> [a]
: [(String, RelationLink)]
ls) MkLink api RelationLink
mkSelf buildLinksFun
ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks
where
relName :: String
relName = Proxy sym -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (forall {k} (t :: k). Proxy t
forall (t :: Symbol). Proxy t
Proxy @sym)
mkSelf :: MkLink api RelationLink
mkSelf = Proxy api -> MkLink api RelationLink
forall {k} (endpoint :: k).
HasRelationLink endpoint =>
Proxy endpoint -> MkLink endpoint RelationLink
toRelationLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @api)
mkLinks :: ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
mkLinks = Proxy ('Layer apiCs cs verb)
-> Proxy m
-> ReplaceHandler
(ServerT ('Layer apiCs cs verb) m) [(String, RelationLink)]
forall (l :: Layer) (m :: * -> *).
(BuildLayerLinks l m, MonadIO m) =>
Proxy l
-> Proxy m -> ReplaceHandler (ServerT l m) [(String, RelationLink)]
buildLayerLinks (forall {k} (t :: k). Proxy t
forall (t :: Layer). Proxy t
Proxy @('Layer apiCs cs verb)) Proxy m
m
child :: RelationLink
child = Proxy (QueryFlag sym :> Verb method status cts a) -> RelationLink
forall {k} (endpoint :: k).
HasTemplatedLink endpoint =>
Proxy endpoint -> RelationLink
toTemplatedLink (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @(MkPrefix '[QueryFlag sym] verb))