-- | Some utility functions for using hxt picklers.
module PickleUtils
( toXML
, maybeFromXML
, eitherFromXML
) where
import Control.Category
import Prelude hiding ((.))
import Text.XML.HXT.Core
-- | Convert a value to an XML string.
toXML :: XmlPickler p => p -> String
toXML = showPickled []
-- | Parse a string containing xml to a value, or `Nothing` if the
-- parse fails.
maybeFromXML :: XmlPickler a => String -> Maybe a
maybeFromXML = either (const Nothing) Just . eitherFromXML
-- | Parse a string containing xml to a value, or an error message on
-- failure.
eitherFromXML :: XmlPickler a => String -> Either String a
eitherFromXML text =
case runLA (removeAllWhiteSpace . xread) text of
[] -> Left "Failed to parse XML in eitherFromXML."
[x] -> unpickleDoc' xpickle x
(_:_) -> Left "Multiple parses in eitherFromXML."