module Text.XML.Monad.Error
(
XmlError(..)
, FromXmlError(..)
, maybeRaise
, asksEither
, asksMaybe
, tryMaybe
, tryBool
)
where
import MonadLib
import qualified Text.XML.Light as L
data XmlError
= EmptyDocument
| InvalidXml
| XmlChildNotFound
| XmlChildNotFoundQ L.QName
| XmlElementNotFound
| XmlElementNotFoundQ L.QName
| XmlAttributeNotFound
| XmlAttributeNotFoundQ L.QName
| UnexpectedElementNameQ L.QName L.QName
| XmlError String
| OtherError String
deriving (Show)
class FromXmlError a where
fromXmlError :: XmlError -> a
instance FromXmlError XmlError where
fromXmlError = id
maybeRaise :: ExceptionM m i => i -> Maybe a -> m a
maybeRaise err Nothing = raise err
maybeRaise _ (Just x) = return x
asksEither :: (ReaderM m s, ExceptionM m e) => (s -> Either e a) -> m a
asksEither f = ask >>= raises . f
asksMaybe :: (ReaderM m s, ExceptionM m e) => e -> (s -> Maybe a) -> m a
asksMaybe err f = ask >>= maybeRaise err . f
tryMaybe :: RunExceptionM m i => m a -> m (Maybe a)
tryMaybe a = either (const Nothing) Just `liftM` try a
tryBool :: RunExceptionM m i => m a -> m Bool
tryBool a = either (const False) (const True) `liftM` try a