module Data.Conduit.Cereal (GetException, sinkGet, conduitGet, sourcePut) where
import Control.Monad.Exception
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import qualified Data.Conduit as C
import Data.Conduit.Cereal.Internal
import Data.Conduit.List (sourceList)
import Data.Serialize hiding (get, put)
import Data.Typeable
data GetException = GetException String
deriving (Show, Typeable)
instance Exception GetException
conduitGet :: MonadException m => Get output -> C.Conduit BS.ByteString m output
conduitGet = mkConduitGet errorHandler
where errorHandler msg _ = pipeError $ GetException msg
sinkGet :: MonadException m => Get r -> C.Sink BS.ByteString m r
sinkGet = mkSinkGet errorHandler terminationHandler
where errorHandler msg _ = pipeError $ GetException msg
terminationHandler f _ = let Fail msg = f BS.empty in pipeError $ GetException msg
pipeError :: (MonadException m, Exception e) => e -> C.Pipe i o m r
pipeError e = C.PipeM (throw e) undefined
sourcePut :: Monad m => Put -> C.Source m BS.ByteString
sourcePut put = sourceList $ LBS.toChunks $ runPutLazy put