{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE OverloadedStrings #-}
module Servant.Hateoas.Resource
(
MkResource,
Resource(..),
addSelfRel,
EmbeddingResource(..),
CollectingResource(..),
ToResource(..)
) where
import Servant
import Servant.Hateoas.RelationLink
import Data.Kind
import Data.Aeson
type family MkResource ct :: (Type -> Type)
class Resource res where
wrap :: a -> res a
addRel :: (String, RelationLink) -> res a -> res a
addSelfRel :: Resource res => RelationLink -> res a -> res a
addSelfRel :: forall (res :: * -> *) a.
Resource res =>
RelationLink -> res a -> res a
addSelfRel RelationLink
l = (String, RelationLink) -> res a -> res a
forall a. (String, RelationLink) -> res a -> res a
forall (res :: * -> *) a.
Resource res =>
(String, RelationLink) -> res a -> res a
addRel (String
"self", RelationLink
l)
class Resource res => EmbeddingResource res where
embed :: ToJSON e => (String, res e) -> res a -> res a
class Resource res => CollectingResource res where
collect :: a -> res a -> res a
class ToResource res a where
toResource :: (res ~ MkResource ct, Accept ct) => Proxy res -> Proxy ct -> a -> res a
default toResource :: (res ~ MkResource ct, Resource res) => Proxy res -> Proxy ct -> a -> res a
toResource Proxy res
_ Proxy ct
_ = a -> res a
forall a. a -> res a
forall (res :: * -> *) a. Resource res => a -> res a
wrap
instance Resource res => ToResource res [a]