{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} -- | -- Module : Servant.XML -- Copyright : (c) Colin Woodbury, 2018 - 2019 -- License : BSD3 -- Maintainer: Colin Woodbury -- -- Servant support for XML. -- -- Types with a `ToXml` instance will be automatically marshalled into XML and -- successfully returned by Servant endpoints. Types with a `FromXml` instance -- can be decoded from request bodies. -- -- In implementing these typeclass instances, you can use the primitives found -- in the /xmlbf/ library. 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, runParser) import Xmlbf.Xeno (fromRawXml) --- -- | The /application\/xml/ Content-Type. To be used in Servant endpoints like: -- -- @ -- data Foo = ... -- -- instance ToXml Foo where -- toXml foo = ... -- -- type API = ... -- :\<|\> "foo" :> Get '[XML] Foo -- :\<|\> "foo" :> "update" :> ReqBody '[XML] Foo :> PostAccepted '[JSON] () -- @ data XML instance Accept XML where contentType _ = "application" M.// "xml" M./: ("charset", "utf-8") instance ToXml a => MimeRender XML a where mimeRender _ = toLazyByteString . encode . toXml instance FromXml a => MimeUnrender XML a where mimeUnrender _ bs = fromRawXml (toStrict bs) >>= runParser fromXml