{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE UndecidableInstances #-} -- | Html servers module Mig.Extra.Server.Html ( -- * Http verbs Get, Post, Put, Delete, Patch, Options, Head, Trace, -- * Response Resp (..), RespOr, -- * utils Link (..), -- * re-exports Body (..), module X, ) where import Mig.Core (Body (..)) import Mig.Core qualified as Core import Mig.Extra.Server.Common as X import Text.Blaze.Html5 qualified as H import Text.Blaze.Html5.Attributes qualified as HA -- response newtype Resp a = Resp (Core.Resp Html a) deriving newtype (IsResp, Eq, Show, Functor) type RespOr err a = Either (Resp err) (Resp a) type Get m a = Send GET m (Resp a) type Post m a = Send POST m (Resp a) type Put m a = Send PUT m (Resp a) type Delete m a = Send DELETE m (Resp a) type Patch m a = Send PATCH m (Resp a) type Options m a = Send OPTIONS m (Resp a) type Head m a = Send HEAD m (Resp a) type Trace m a = Send TRACE m (Resp a) {-| HTML a-links, this type is useful for using with template engines that rely on @ToJSON@ instance. Also it can be rendered as Html with @ToMarkup@ instance. -} data Link = Link { href :: Url , name :: Text } deriving (Generic, ToJSON) instance ToMarkup Link where toMarkup link = H.a H.! HA.href (renderUrl link.href) $ H.text link.name