45 lines
1.0 KiB
Haskell
45 lines
1.0 KiB
Haskell
{-# Language OverloadedStrings #-}
|
|
{-# Language FlexibleInstances #-}
|
|
{-# Language MultiParamTypeClasses #-}
|
|
{-# Language TypeApplications #-}
|
|
module Servant.XML
|
|
( ToNode(..)
|
|
, XML
|
|
, OPDS
|
|
, Text.Hamlet.XML.xml
|
|
, iso8601 )
|
|
where
|
|
|
|
import Text.XML
|
|
import ClassyPrelude
|
|
import Text.Hamlet.XML
|
|
import Servant
|
|
import Network.HTTP.Media.MediaType
|
|
|
|
data XML
|
|
|
|
data OPDS
|
|
|
|
instance (ToNode a) => MimeRender XML a where
|
|
mimeRender _ a =
|
|
let [NodeElement root] = toNode a
|
|
in renderLBS def (Document (Prologue [] Nothing []) root [])
|
|
|
|
instance (ToNode a) => MimeRender OPDS a where
|
|
mimeRender _ a = mimeRender (Proxy @XML) a
|
|
|
|
instance Accept XML where
|
|
contentType _ = "application" // "xml" /: ("charset", "utf-8")
|
|
|
|
instance Accept OPDS where
|
|
contentType _ = "application" // "atom+xml" /: ("charset", "utf-8") /: ("profile", "opds-catalog")
|
|
|
|
iso8601 :: UTCTime -> Text
|
|
iso8601 = pack . formatTime defaultTimeLocale "%Y-%m-%dT%H:%M:%SZ"
|
|
|
|
class ToNode a where
|
|
toNode :: a -> [Node]
|
|
|
|
instance (ToNode a) => ToNode [a] where
|
|
toNode = concatMap toNode
|