packages feed

servant-hateoas-0.3.0: src/Servant/Hateoas/HasHandler.hs

module Servant.Hateoas.HasHandler
(
  -- * Class
  HasHandler(..)
)
where

import Servant
import Control.Monad.IO.Class
import GHC.TypeLits

-- | Typeclass for extracting the handler of an API.
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 m _ = getHandler m (Proxy @a) :<|> getHandler m (Proxy @b)

instance {-# OVERLAPPABLE #-} HasHandler b => HasHandler ((a :: Symbol) :> b) where
  getHandler m _ = getHandler m (Proxy @b)

instance {-# OVERLAPPABLE #-} HasHandler b => HasHandler (Description sym :> b) where
  getHandler m _ = getHandler m (Proxy @b)

instance {-# OVERLAPPABLE #-} HasHandler b => HasHandler (Summary sym :> b) where
  getHandler m _ = getHandler m (Proxy @b)

instance {-# OVERLAPPABLE #-} HasHandler b => HasHandler (Fragment a :> b) where
  getHandler m _ = getHandler m (Proxy @b)

instance HasHandler EmptyAPI where
  getHandler _ _ = emptyServer