module Pdf.Toolbox.Core.IO
(
IS,
RIS,
RIS.fromHandle,
RIS.fromHandle',
MonadIO,
liftIO,
size,
seek,
tell,
parse,
inputStream,
takeBytes,
readExactly,
dropExactly
)
where
import Data.Int
import Data.Attoparsec.ByteString (Parser)
import Data.ByteString (ByteString)
import Control.Monad.IO.Class
import Control.Exception
import qualified System.IO.Streams as Streams
import qualified System.IO.Streams.Attoparsec as Streams
import Pdf.Toolbox.Core.Error
import qualified Pdf.Toolbox.Core.IO.RIS as RIS
import Pdf.Toolbox.Core.IO.RIS (RIS, IS)
size :: MonadIO m => RIS -> PdfE m Int64
size = tryPdfIO . RIS.size
seek :: MonadIO m => RIS -> Int64 -> PdfE m ()
seek ris = tryPdfIO . RIS.seek ris
tell :: MonadIO m => RIS -> PdfE m Int64
tell = tryPdfIO . RIS.tell
parse :: MonadIO m => Parser r -> IS -> PdfE m r
parse p is = do
res <- liftIO $ (Right <$> Streams.parseFromStream p is)
`catch` (\(Streams.ParseException str) -> return $ Left $ ParseError [] str)
`catch` (\(e :: IOError) -> return $ Left $ IOError e)
case res of
Left e -> throwE e
Right r -> return r
inputStream :: MonadIO m => RIS -> PdfE m IS
inputStream = tryPdfIO . RIS.inputStream
takeBytes :: MonadIO m => Int64 -> IS -> PdfE m IS
takeBytes n = tryPdfIO . Streams.takeBytes n
readExactly :: MonadIO m => Int -> IS -> PdfE m ByteString
readExactly n = tryPdfIO . Streams.readExactly n
dropExactly :: MonadIO m => Int -> IS -> PdfE m ()
dropExactly n is = readExactly n is >> return ()