packages feed

dom-parser-3.2.0: src/Text/XML/Soap.hs

module Text.XML.Soap where

import Control.Lens
import Data.String
import Text.XML
import Text.XML.DOM.Parser
import Text.XML.Writer

data XmlEnvelope h b = XmlEnvelope
  { _xeHeader :: !(Maybe h)
  , _xeBody   :: !(Maybe b)
  } deriving (Eq, Show)

makeLenses ''XmlEnvelope

xmlEnvelopeToDocument :: (ToXML h, ToXML b) => XmlEnvelope h b -> Document
xmlEnvelopeToDocument xe = doc
  where
    sname n = fromString $ "{http://schemas.xmlsoap.org/soap/envelope/}" <> n
    doc    =
      Document
        { documentPrologue = Prologue [] Nothing []
        , documentRoot     =
          Element
            { elementName       = sname "Envelope"
            , elementAttributes = mempty
            , elementNodes      = [NodeElement header, NodeElement body]
            }
        , documentEpilogue = []
        }
    header =
      Element
        { elementName       = sname "Header"
        , elementAttributes = mempty
        , elementNodes      = render . toXML $ xe ^. xeHeader
        }
    body   =
      Element
        { elementName       = sname "Body"
        , elementAttributes = mempty
        , elementNodes      = render . toXML $ xe ^. xeBody
        }

instance (FromDom h, FromDom b) => FromDom (XmlEnvelope h b) where
  fromDom = XmlEnvelope <$> inElemMay "Header" fromDom
                        <*> inElemMay "Body" fromDom