module Servant.Hateoas.HasHandler
(
HasHandler(..)
)
where
import Servant
import Control.Monad.IO.Class
import GHC.TypeLits
class HasHandler api where
getHandler :: MonadIO m => Proxy m -> Proxy api -> ServerT api m
instance {-# OVERLAPPABLE #-} (HasHandler a, HasHandler b) => HasHandler (a :<|> b) where
getHandler :: forall (m :: * -> *).
MonadIO m =>
Proxy m -> Proxy (a :<|> b) -> ServerT (a :<|> b) m
getHandler Proxy m
m Proxy (a :<|> b)
_ = Proxy m -> Proxy a -> ServerT a m
forall {k} (api :: k) (m :: * -> *).
(HasHandler api, MonadIO m) =>
Proxy m -> Proxy api -> ServerT api m
forall (m :: * -> *).
MonadIO m =>
Proxy m -> Proxy a -> ServerT a m
getHandler Proxy m
m (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) ServerT a m -> ServerT b m -> ServerT a m :<|> ServerT b m
forall a b. a -> b -> a :<|> b
:<|> Proxy m -> Proxy b -> ServerT b m
forall {k} (api :: k) (m :: * -> *).
(HasHandler api, MonadIO m) =>
Proxy m -> Proxy api -> ServerT api m
forall (m :: * -> *).
MonadIO m =>
Proxy m -> Proxy b -> ServerT b m
getHandler Proxy m
m (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @b)
instance {-# OVERLAPPABLE #-} HasHandler b => HasHandler ((a :: Symbol) :> b) where
getHandler :: forall (m :: * -> *).
MonadIO m =>
Proxy m -> Proxy (a :> b) -> ServerT (a :> b) m
getHandler Proxy m
m Proxy (a :> b)
_ = Proxy m -> Proxy b -> ServerT b m
forall {k} (api :: k) (m :: * -> *).
(HasHandler api, MonadIO m) =>
Proxy m -> Proxy api -> ServerT api m
forall (m :: * -> *).
MonadIO m =>
Proxy m -> Proxy b -> ServerT b m
getHandler Proxy m
m (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @b)
instance {-# OVERLAPPABLE #-} HasHandler b => HasHandler (Description sym :> b) where
getHandler :: forall (m :: * -> *).
MonadIO m =>
Proxy m
-> Proxy (Description sym :> b) -> ServerT (Description sym :> b) m
getHandler Proxy m
m Proxy (Description sym :> b)
_ = Proxy m -> Proxy b -> ServerT b m
forall {k} (api :: k) (m :: * -> *).
(HasHandler api, MonadIO m) =>
Proxy m -> Proxy api -> ServerT api m
forall (m :: * -> *).
MonadIO m =>
Proxy m -> Proxy b -> ServerT b m
getHandler Proxy m
m (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @b)
instance {-# OVERLAPPABLE #-} HasHandler b => HasHandler (Summary sym :> b) where
getHandler :: forall (m :: * -> *).
MonadIO m =>
Proxy m -> Proxy (Summary sym :> b) -> ServerT (Summary sym :> b) m
getHandler Proxy m
m Proxy (Summary sym :> b)
_ = Proxy m -> Proxy b -> ServerT b m
forall {k} (api :: k) (m :: * -> *).
(HasHandler api, MonadIO m) =>
Proxy m -> Proxy api -> ServerT api m
forall (m :: * -> *).
MonadIO m =>
Proxy m -> Proxy b -> ServerT b m
getHandler Proxy m
m (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @b)
instance {-# OVERLAPPABLE #-} HasHandler b => HasHandler (Fragment a :> b) where
getHandler :: forall (m :: * -> *).
MonadIO m =>
Proxy m -> Proxy (Fragment a :> b) -> ServerT (Fragment a :> b) m
getHandler Proxy m
m Proxy (Fragment a :> b)
_ = Proxy m -> Proxy b -> ServerT b m
forall {k} (api :: k) (m :: * -> *).
(HasHandler api, MonadIO m) =>
Proxy m -> Proxy api -> ServerT api m
forall (m :: * -> *).
MonadIO m =>
Proxy m -> Proxy b -> ServerT b m
getHandler Proxy m
m (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @b)
instance HasHandler EmptyAPI where
getHandler :: forall (m :: * -> *).
MonadIO m =>
Proxy m -> Proxy EmptyAPI -> ServerT EmptyAPI m
getHandler Proxy m
_ Proxy EmptyAPI
_ = ServerT EmptyAPI m
forall (m :: * -> *). ServerT EmptyAPI m
emptyServer