Unify Errors.

This commit is contained in:
Jesse Rosenthal 2016-12-01 12:13:51 -05:00 committed by John MacFarlane
parent 52859b9863
commit 3574b98f81
27 changed files with 83 additions and 64 deletions

View file

@ -180,7 +180,7 @@ import Text.Pandoc.Templates
import Text.Pandoc.Options
import Text.Pandoc.Shared (safeRead, mapLeft, pandocVersion)
import Text.Pandoc.Error
import Text.Pandoc.Class (PandocMonad, runIOorExplode, PandocExecutionError(..))
import Text.Pandoc.Class (PandocMonad, runIOorExplode)
import Data.Aeson
import qualified Data.ByteString.Lazy as BL
import Data.List (intercalate)
@ -387,7 +387,7 @@ class ToJSONFilter a => ToJsonFilter a
toJsonFilter = toJSONFilter
readJSON :: ReaderOptions -> String -> Either PandocError Pandoc
readJSON _ = mapLeft ParseFailure . eitherDecode' . UTF8.fromStringLazy
readJSON _ = mapLeft PandocParseError . eitherDecode' . UTF8.fromStringLazy
writeJSON :: WriterOptions -> Pandoc -> String
writeJSON _ = UTF8.toStringLazy . encode

View file

@ -39,7 +39,6 @@ module Text.Pandoc.Class ( PandocMonad(..)
, addWarningWithPos
, PandocIO(..)
, PandocPure(..)
, PandocExecutionError(..)
, FileInfo(..)
, runIO
, runIOorExplode
@ -83,12 +82,12 @@ import Control.Monad.State hiding (fail)
import Control.Monad.Reader hiding (fail)
import Control.Monad.Except hiding (fail)
import Data.Word (Word8)
import Data.Typeable
import Data.Default
import System.IO.Error
import qualified Data.Map as M
import Text.Pandoc.Error
class (Functor m, Applicative m, Monad m, MonadError PandocExecutionError m) => PandocMonad m where
class (Functor m, Applicative m, Monad m, MonadError PandocError m) => PandocMonad m where
lookupEnv :: String -> m (Maybe String)
getCurrentTime :: m UTCTime
getCurrentTimeZone :: m TimeZone
@ -143,12 +142,6 @@ addWarningWithPos mbpos msg =
warn $
msg ++ maybe "" (\pos -> " " ++ show pos) mbpos
-- We can add to this as we go
data PandocExecutionError = PandocFileReadError FilePath
| PandocShouldNeverHappenError String
| PandocParseError String
| PandocSomeError String
deriving (Show, Typeable)
-- Nothing in this for now, but let's put it there anyway.
data PandocStateIO = PandocStateIO { ioStWarnings :: [String]
@ -168,35 +161,35 @@ instance Default PandocEnvIO where
, ioEnvOutputFile = Nothing -- stdout
}
runIO :: PandocIO a -> IO (Either PandocExecutionError a)
runIO :: PandocIO a -> IO (Either PandocError a)
runIO ma = flip evalStateT def $ flip runReaderT def $ runExceptT $ unPandocIO ma
withMediaBag :: PandocMonad m => m a -> m (a, MediaBag)
withMediaBag ma = ((,)) <$> ma <*> getMediaBag
runIOorExplode :: PandocIO a -> IO a
runIOorExplode ma = do
eitherVal <- runIO ma
case eitherVal of
Right x -> return x
Left (PandocFileReadError fp) -> error $ "problem reading " ++ fp
Left (PandocShouldNeverHappenError s) -> error s
Left (PandocParseError s) -> error $ "parse error" ++ s
Left (PandocSomeError s) -> error s
runIOorExplode ma = handleError <$> runIO ma
-- eitherVal <- runIO ma
-- case eitherVal of
-- Right x -> return x
-- Left (PandocFileReadError fp) -> error $ "problem reading " ++ fp
-- Left (PandocShouldNeverHappenError s) -> error s
-- Left (PandocParseError s) -> error $ "parse error" ++ s
-- Left (PandocSomeError s) -> error s
newtype PandocIO a = PandocIO {
unPandocIO :: ExceptT PandocExecutionError (ReaderT PandocEnvIO (StateT PandocStateIO IO)) a
unPandocIO :: ExceptT PandocError (ReaderT PandocEnvIO (StateT PandocStateIO IO)) a
} deriving ( MonadIO
, Functor
, Applicative
, Monad
, MonadReader PandocEnvIO
, MonadState PandocStateIO
, MonadError PandocExecutionError
, MonadError PandocError
)
instance PandocMonad PandocIO where
@ -303,20 +296,18 @@ instance Default PureEnv where
, envOutputFile = Nothing
}
instance E.Exception PandocExecutionError
newtype PandocPure a = PandocPure {
unPandocPure :: ExceptT PandocExecutionError
unPandocPure :: ExceptT PandocError
(ReaderT PureEnv (State PureState)) a
} deriving ( Functor
, Applicative
, Monad
, MonadReader PureEnv
, MonadState PureState
, MonadError PandocExecutionError
, MonadError PandocError
)
runPure :: PandocPure a -> Either PandocExecutionError a
runPure :: PandocPure a -> Either PandocError a
runPure x = flip evalState def $ flip runReaderT def $ runExceptT $ unPandocPure x
instance PandocMonad PandocPure where

View file

@ -33,17 +33,24 @@ module Text.Pandoc.Error (PandocError(..), handleError) where
import Text.Parsec.Error
import Text.Parsec.Pos hiding (Line)
import GHC.Generics (Generic)
import Data.Generics (Typeable)
import Control.Exception (Exception)
type Input = String
data PandocError = -- | Generic parse failure
ParseFailure String
-- | Error thrown by a Parsec parser
| ParsecError Input ParseError
deriving (Show, Typeable, Generic)
data PandocError = PandocFileReadError FilePath
| PandocShouldNeverHappenError String
| PandocSomeError String
| PandocParseError String
| PandocParsecError Input ParseError
deriving (Show, Typeable)
-- data PandocError = -- | Generic parse failure
-- ParseFailure String
-- -- | Error thrown by a Parsec parser
-- | ParsecError Input ParseError
-- deriving (Show, Typeable, Generic)
instance Exception PandocError
@ -52,8 +59,11 @@ handleError :: Either PandocError a -> a
handleError (Right r) = r
handleError (Left err) =
case err of
ParseFailure string -> error string
ParsecError input err' ->
PandocFileReadError fp -> error $ "problem reading " ++ fp
PandocShouldNeverHappenError s -> error s
PandocSomeError s -> error s
PandocParseError s -> error s
PandocParsecError input err' ->
let errPos = errorPos err'
errLine = sourceLine errPos
errColumn = sourceColumn errPos

View file

@ -885,7 +885,7 @@ readWithM :: (Monad m)
-> String -- ^ input
-> m (Either PandocError a)
readWithM parser state input =
mapLeft (ParsecError input) `liftM` runParserT parser state "source" input
mapLeft (PandocParsecError input) `liftM` runParserT parser state "source" input
-- | Parse a string with a given parser and state

View file

@ -96,8 +96,9 @@ import qualified Data.Sequence as Seq (null)
#if !(MIN_VERSION_base(4,8,0))
import Data.Traversable (traverse)
#endif
import Text.Pandoc.Error
import Control.Monad.Except (throwError)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Class (PandocMonad)
import qualified Text.Pandoc.Class as P
readDocx :: PandocMonad m

View file

@ -32,7 +32,8 @@ import Data.Maybe (mapMaybe, fromMaybe)
import qualified Data.Map as M (Map, lookup, fromList, elems)
import Data.Monoid ((<>))
import Control.DeepSeq (deepseq, NFData)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Error
import Text.Pandoc.Class (PandocMonad)
import qualified Text.Pandoc.Class as P
import Debug.Trace (trace)

View file

@ -68,7 +68,8 @@ import Text.Pandoc.CSS (foldOrElse, pickStyleAttrProps)
import Data.Monoid ((<>))
import Text.Parsec.Error
import qualified Data.Set as Set
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Error
import Text.Pandoc.Class (PandocMonad)
import Control.Monad.Except (throwError)

View file

@ -25,8 +25,9 @@ import Text.Pandoc.Options
import Documentation.Haddock.Parser
import Documentation.Haddock.Types
import Debug.Trace (trace)
import Text.Pandoc.Error
import Control.Monad.Except (throwError)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Class (PandocMonad)
-- | Parse Haddock markup and return a 'Pandoc' document.
@ -40,7 +41,7 @@ readHaddock opts s = case readHaddockEither opts s of
readHaddockEither :: ReaderOptions -- ^ Reader options
-> String -- ^ String to parse
-> Either PandocExecutionError Pandoc
-> Either PandocError Pandoc
readHaddockEither opts =
#if MIN_VERSION_haddock_library(1,2,0)
Right . B.doc . docHToBlocks . trace' . _doc . parseParas

View file

@ -57,7 +57,7 @@ import Text.Pandoc.Highlighting (fromListingsLanguage)
import Text.Pandoc.ImageSize (numUnit, showFl)
import Text.Pandoc.Error
import Control.Monad.Except (throwError)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..), PandocPure)
import Text.Pandoc.Class (PandocMonad, PandocPure)
-- | Parse LaTeX from string and return 'Pandoc' document.
readLaTeX :: PandocMonad m
@ -939,7 +939,7 @@ type IncludeParser = ParserT String [String] IO String
-- | Replace "include" commands with file contents.
handleIncludes :: String -> IO (Either PandocError String)
handleIncludes s = mapLeft (ParsecError s) <$> runParserT includeParser' [] "input" s
handleIncludes s = mapLeft (PandocParsecError s) <$> runParserT includeParser' [] "input" s
includeParser' :: IncludeParser
includeParser' =

View file

@ -68,7 +68,8 @@ import Debug.Trace (trace)
import Data.Monoid ((<>))
import Control.Monad.Trans (lift)
import Control.Monad.Except (throwError, catchError)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Error
import Text.Pandoc.Class (PandocMonad)
import qualified Text.Pandoc.Class as P
type MarkdownParser m = ParserT [Char] ParserState m

View file

@ -58,7 +58,8 @@ import Data.Maybe (fromMaybe)
import Text.Printf (printf)
import Debug.Trace (trace)
import Control.Monad.Except (throwError)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Error(PandocError(..))
import Text.Pandoc.Class (PandocMonad)
-- | Read mediawiki from an input string and return a Pandoc document.
readMediaWiki :: PandocMonad m

View file

@ -65,5 +65,5 @@ readInlines :: String -> Either PandocError [Inline]
readInlines s = maybe ((:[]) <$> readInline s) Right (safeRead s)
readInline :: String -> Either PandocError Inline
readInline s = maybe (Left . ParseFailure $ "Could not read: " ++ s) Right (safeRead s)
readInline s = maybe (Left . PandocParseError $ "Could not read: " ++ s) Right (safeRead s)

View file

@ -13,7 +13,7 @@ import Control.Monad.State
import Data.Default
import Control.Monad.Except
import Text.Pandoc.Error
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Class (PandocMonad)
type OPML m = StateT OPMLState m
@ -65,7 +65,7 @@ attrValue attr elt =
Just z -> z
Nothing -> ""
-- exceptT :: PandocMonad m => Either PandocExecutionError a -> OPML m a
-- exceptT :: PandocMonad m => Either PandocError a -> OPML m a
-- exceptT = either throwError return
asHtml :: PandocMonad m => String -> OPML m Inlines

View file

@ -41,7 +41,7 @@ import System.FilePath
import Control.Monad.Except (throwError)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Class (PandocMonad)
import qualified Text.Pandoc.Class as P
import Text.Pandoc.Definition
import Text.Pandoc.Error
@ -78,7 +78,7 @@ readOdt' _ bytes = bytesToOdt bytes-- of
bytesToOdt :: B.ByteString -> Either PandocError (Pandoc, MediaBag)
bytesToOdt bytes = case toArchiveOrFail bytes of
Right archive -> archiveToOdt archive
Left _ -> Left $ ParseFailure "Couldn't parse odt file."
Left _ -> Left $ PandocParseError "Couldn't parse odt file."
--
archiveToOdt :: Archive -> Either PandocError (Pandoc, MediaBag)
@ -99,7 +99,7 @@ archiveToOdt archive
| otherwise
-- Not very detailed, but I don't think more information would be helpful
= Left $ ParseFailure "Couldn't parse odt file."
= Left $ PandocParseError "Couldn't parse odt file."
where
filePathIsOdtMedia :: FilePath -> Bool
filePathIsOdtMedia fp =

View file

@ -31,8 +31,9 @@ import Text.Pandoc.Readers.Org.Blocks ( blockList, meta )
import Text.Pandoc.Readers.Org.Parsing ( OrgParser, readWithM )
import Text.Pandoc.Readers.Org.ParserState ( optionsToParserState )
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Class (PandocMonad)
import Text.Pandoc.Definition
import Text.Pandoc.Error
import Text.Pandoc.Options
import Control.Monad.Except ( throwError )

View file

@ -51,7 +51,8 @@ import Data.Char (toLower, isHexDigit, isSpace)
import Data.Monoid ((<>))
import Control.Monad.Except (throwError)
import Control.Monad.Trans (lift)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Error
import Text.Pandoc.Class (PandocMonad)
import qualified Text.Pandoc.Class as P
-- | Parse reStructuredText string and return Pandoc document.

View file

@ -48,7 +48,7 @@ import qualified Data.Foldable as F
import Text.Pandoc.Error
import Control.Monad.Except (throwError)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Class (PandocMonad)
import qualified Text.Pandoc.Class as P
-- | Read twiki from an input string and return a Pandoc document.

View file

@ -68,7 +68,8 @@ import Control.Monad ( guard, liftM, when )
import Data.Monoid ((<>))
import Text.Printf
import Debug.Trace (trace)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Error
import Text.Pandoc.Class (PandocMonad)
import Control.Monad.Except (throwError)
-- | Parse a Textile text and return a Pandoc document.

View file

@ -50,7 +50,8 @@ import Control.Monad.Reader (Reader, runReader, asks)
import Data.Time.Format (formatTime)
import Text.Pandoc.Compat.Time (defaultTimeLocale)
import Control.Monad.Except (throwError, catchError)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Error
import Text.Pandoc.Class (PandocMonad)
import qualified Text.Pandoc.Class as P
type T2T = ParserT String ParserState (Reader T2TMeta)

View file

@ -65,7 +65,8 @@ import Text.Pandoc.MIME (MimeType, getMimeType, extensionFromMimeType)
import Text.Blaze.Html.Renderer.Utf8 (renderHtml)
import Text.HTML.TagSoup (Tag(TagOpen), fromAttrib, parseTags)
import Control.Monad.Except (throwError)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Error
import Text.Pandoc.Class (PandocMonad)
import qualified Text.Pandoc.Class as P
-- A Chapter includes a list of blocks and maybe a section

View file

@ -46,7 +46,8 @@ import Text.Pandoc.Definition
import Text.Pandoc.Options (WriterOptions(..), HTMLMathMethod(..), def)
import Text.Pandoc.Shared (orderedListMarkers, isHeaderBlock, capitalize,
linesToPara)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Error
import Text.Pandoc.Class (PandocMonad)
import qualified Text.Pandoc.Class as P
-- | Data to be written at the end of the document:

View file

@ -69,7 +69,8 @@ import qualified Text.XML.Light as XML
import System.FilePath (takeExtension)
import Data.Aeson (Value)
import Control.Monad.Except (throwError)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Error
import Text.Pandoc.Class (PandocMonad)
data WriterState = WriterState
{ stNotes :: [Html] -- ^ List of notes

View file

@ -41,8 +41,9 @@ import Data.Maybe (fromMaybe)
import Text.Pandoc.Pretty
import Text.Pandoc.Builder (deleteMeta)
import Control.Monad.State
import Text.Pandoc.Error
import Control.Monad.Except (throwError)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Class (PandocMonad)
type Notes = [[Block]]
data WriterState = WriterState { stNotes :: Notes

View file

@ -58,7 +58,8 @@ import qualified Data.Vector as V
import qualified Data.Text as T
import qualified Data.Set as Set
import Network.HTTP ( urlEncode )
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Error
import Text.Pandoc.Class (PandocMonad)
type Notes = [[Block]]
type Ref = ([Inline], Target, Attr)

View file

@ -40,8 +40,9 @@ import Text.Pandoc.Writers.Markdown (writeMarkdown)
import Text.Pandoc.Pretty
import Text.Pandoc.Compat.Time
import qualified Text.Pandoc.Builder as B
import Text.Pandoc.Error
import Control.Monad.Except (throwError)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Class (PandocMonad)
-- | Convert Pandoc document to string in OPML format.
writeOPML :: PandocMonad m => WriterOptions -> Pandoc -> m String

View file

@ -44,7 +44,8 @@ import qualified Data.Map as M
import Text.Printf ( printf )
import Text.Pandoc.ImageSize
import Control.Monad.Except (throwError)
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
import Text.Pandoc.Error
import Text.Pandoc.Class (PandocMonad)
import qualified Text.Pandoc.Class as P
-- | Convert Image inlines into a raw RTF embedded image, read from a file,

View file

@ -45,7 +45,8 @@ import Network.URI ( isURI, unEscapeString )
import System.FilePath
import qualified Data.Set as Set
import Control.Monad.Except (throwError)
import Text.Pandoc.Class ( PandocMonad, PandocExecutionError(..) )
import Text.Pandoc.Error
import Text.Pandoc.Class ( PandocMonad)
data WriterState =
WriterState { stStrikeout :: Bool -- document contains strikeout