{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DerivingStrategies #-} module Servant.Hateoas.Example where import Servant.Hateoas import Servant import Data.Aeson import GHC.Generics data User = User { User -> Int usrId :: Int, User -> Int addressId :: Int, User -> Double income :: Double } deriving stock ((forall x. User -> Rep User x) -> (forall x. Rep User x -> User) -> Generic User forall x. Rep User x -> User forall x. User -> Rep User x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a $cfrom :: forall x. User -> Rep User x from :: forall x. User -> Rep User x $cto :: forall x. Rep User x -> User to :: forall x. Rep User x -> User Generic, Int -> User -> ShowS [User] -> ShowS User -> String (Int -> User -> ShowS) -> (User -> String) -> ([User] -> ShowS) -> Show User forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a $cshowsPrec :: Int -> User -> ShowS showsPrec :: Int -> User -> ShowS $cshow :: User -> String show :: User -> String $cshowList :: [User] -> ShowS showList :: [User] -> ShowS Show, User -> User -> Bool (User -> User -> Bool) -> (User -> User -> Bool) -> Eq User forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a $c== :: User -> User -> Bool == :: User -> User -> Bool $c/= :: User -> User -> Bool /= :: User -> User -> Bool Eq, Eq User Eq User => (User -> User -> Ordering) -> (User -> User -> Bool) -> (User -> User -> Bool) -> (User -> User -> Bool) -> (User -> User -> Bool) -> (User -> User -> User) -> (User -> User -> User) -> Ord User User -> User -> Bool User -> User -> Ordering User -> User -> User forall a. Eq a => (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a $ccompare :: User -> User -> Ordering compare :: User -> User -> Ordering $c< :: User -> User -> Bool < :: User -> User -> Bool $c<= :: User -> User -> Bool <= :: User -> User -> Bool $c> :: User -> User -> Bool > :: User -> User -> Bool $c>= :: User -> User -> Bool >= :: User -> User -> Bool $cmax :: User -> User -> User max :: User -> User -> User $cmin :: User -> User -> User min :: User -> User -> User Ord) deriving anyclass [User] -> Value [User] -> Encoding User -> Bool User -> Value User -> Encoding (User -> Value) -> (User -> Encoding) -> ([User] -> Value) -> ([User] -> Encoding) -> (User -> Bool) -> ToJSON User forall a. (a -> Value) -> (a -> Encoding) -> ([a] -> Value) -> ([a] -> Encoding) -> (a -> Bool) -> ToJSON a $ctoJSON :: User -> Value toJSON :: User -> Value $ctoEncoding :: User -> Encoding toEncoding :: User -> Encoding $ctoJSONList :: [User] -> Value toJSONList :: [User] -> Value $ctoEncodingList :: [User] -> Encoding toEncodingList :: [User] -> Encoding $comitField :: User -> Bool omitField :: User -> Bool ToJSON data Address = Address { Address -> Int addrId :: Int, Address -> String street :: String, Address -> Int number :: Int} deriving stock ((forall x. Address -> Rep Address x) -> (forall x. Rep Address x -> Address) -> Generic Address forall x. Rep Address x -> Address forall x. Address -> Rep Address x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a $cfrom :: forall x. Address -> Rep Address x from :: forall x. Address -> Rep Address x $cto :: forall x. Rep Address x -> Address to :: forall x. Rep Address x -> Address Generic, Int -> Address -> ShowS [Address] -> ShowS Address -> String (Int -> Address -> ShowS) -> (Address -> String) -> ([Address] -> ShowS) -> Show Address forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a $cshowsPrec :: Int -> Address -> ShowS showsPrec :: Int -> Address -> ShowS $cshow :: Address -> String show :: Address -> String $cshowList :: [Address] -> ShowS showList :: [Address] -> ShowS Show, Address -> Address -> Bool (Address -> Address -> Bool) -> (Address -> Address -> Bool) -> Eq Address forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a $c== :: Address -> Address -> Bool == :: Address -> Address -> Bool $c/= :: Address -> Address -> Bool /= :: Address -> Address -> Bool Eq, Eq Address Eq Address => (Address -> Address -> Ordering) -> (Address -> Address -> Bool) -> (Address -> Address -> Bool) -> (Address -> Address -> Bool) -> (Address -> Address -> Bool) -> (Address -> Address -> Address) -> (Address -> Address -> Address) -> Ord Address Address -> Address -> Bool Address -> Address -> Ordering Address -> Address -> Address forall a. Eq a => (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a $ccompare :: Address -> Address -> Ordering compare :: Address -> Address -> Ordering $c< :: Address -> Address -> Bool < :: Address -> Address -> Bool $c<= :: Address -> Address -> Bool <= :: Address -> Address -> Bool $c> :: Address -> Address -> Bool > :: Address -> Address -> Bool $c>= :: Address -> Address -> Bool >= :: Address -> Address -> Bool $cmax :: Address -> Address -> Address max :: Address -> Address -> Address $cmin :: Address -> Address -> Address min :: Address -> Address -> Address Ord) deriving anyclass [Address] -> Value [Address] -> Encoding Address -> Bool Address -> Value Address -> Encoding (Address -> Value) -> (Address -> Encoding) -> ([Address] -> Value) -> ([Address] -> Encoding) -> (Address -> Bool) -> ToJSON Address forall a. (a -> Value) -> (a -> Encoding) -> ([a] -> Value) -> ([a] -> Encoding) -> (a -> Bool) -> ToJSON a $ctoJSON :: Address -> Value toJSON :: Address -> Value $ctoEncoding :: Address -> Encoding toEncoding :: Address -> Encoding $ctoJSONList :: [Address] -> Value toJSONList :: [Address] -> Value $ctoEncodingList :: [Address] -> Encoding toEncodingList :: [Address] -> Encoding $comitField :: Address -> Bool omitField :: Address -> Bool ToJSON type CompleteApi = AddressApi :<|> UserApi type AddressApi = AddressGetOne type AddressGetOne = "address" :> Capture "id" Int :> Get '[HAL JSON] (HALResource Address) type UserApi = UserGetOne :<|> UserGetAll type UserGetOne = "user" :> Capture "id" Int :> Get '[HAL JSON] (HALResource User) type UserGetAll = "user" :> Get '[Collection JSON] (CollectionResource User) instance Related User where type IdSelName User = "usrId" type GetOneApi User = UserGetOne type CollectionName User = "users" type Relations User = '[ 'HRel "address" "addressId" AddressGetOne ]