{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
module Servant.XML where
import Data.ByteString.Builder (toLazyByteString)
import Data.ByteString.Lazy (toStrict)
import qualified Network.HTTP.Media as M
import Servant.API
import Xmlbf (FromXml(..), ToXml(..), encode, parse)
import Xmlbf.Xeno (fromRawXml)
data XML
instance Accept XML where
contentType :: Proxy XML -> MediaType
contentType Proxy XML
_ = ByteString
"application" ByteString -> ByteString -> MediaType
M.// ByteString
"xml" MediaType -> (ByteString, ByteString) -> MediaType
M./: (ByteString
"charset", ByteString
"utf-8")
instance ToXml a => MimeRender XML a where
mimeRender :: Proxy XML -> a -> ByteString
mimeRender Proxy XML
_ = Builder -> ByteString
toLazyByteString forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Node] -> Builder
encode forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ToXml a => a -> [Node]
toXml
instance FromXml a => MimeUnrender XML a where
mimeUnrender :: Proxy XML -> ByteString -> Either String a
mimeUnrender Proxy XML
_ ByteString
bs = ByteString -> Either String [Node]
fromRawXml (ByteString -> ByteString
toStrict ByteString
bs) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. Parser a -> [Node] -> Either String a
parse forall a (m :: * -> *). (FromXml a, Monad m) => ParserT m a
fromXml