module Pdf.Toolbox.Core.Error
(
PdfError(..),
PdfE,
annotateError,
annotatingError,
tryPdfIO,
module Control.Error
)
where
import Control.Error
import Control.Exception
import Control.Monad
import Control.Monad.IO.Class
data PdfError =
ParseError [String] String |
IOError IOError |
AnnotatedError String PdfError |
UnexpectedError String
deriving Show
type PdfE m = EitherT PdfError m
annotateError :: Monad m => String -> PdfE m a -> PdfE m a
annotateError ann = fmapLT (AnnotatedError ann')
where
ann' = if length ann <= 50 then ann else take 47 ann ++ "..."
annotatingError :: Monad m => PdfE m a -> String -> PdfE m a
annotatingError = flip annotateError
tryPdfIO :: MonadIO m => IO a -> PdfE m a
tryPdfIO action = do
res <- liftIO $ Right `liftM` action
`catch` (\(e :: IOError) -> return $ Left $ IOError e)
case res of
Right a -> return a
Left e -> left e