module Data.Packer.MessagePack.Internal.Util where
import Control.Monad.IO.Class
import Data.Packer
import Data.Word
import UnliftIO.Exception
import Data.Packer.MessagePack.Internal.Exceptions
unpackPeekWord8 :: Unpacking Word8
unpackPeekWord8 = do
pos <- unpackGetPosition
w <- getWord8
unpackSetPosition pos
return w
shrinkType :: forall f a b.
(Applicative f, Integral a, Integral b, Bounded a, Bounded b)
=> f b -> a -> f b
shrinkType overflowFail a =
if fromIntegral (minBound :: b) <= a && a <= fromIntegral (maxBound :: b)
then pure (fromIntegral a :: b)
else overflowFail
shrinkTypeIO :: forall m a b.
(MonadIO m, Integral a, Integral b, Bounded a, Bounded b)
=> a -> m b
shrinkTypeIO = shrinkType (throwIO (MsgPackDeserializationFailure "Integer Overflow"))