module M.IO.Internal.Zlib (safedecomp) where
import Codec.Compression.Zlib
import Data.ByteString (ByteString)
import Data.ByteString qualified as B
import Data.ByteString.Lazy qualified as BL
safedecomp ::
Int ->
ByteString ->
IO ByteString
safedecomp :: Int -> ByteString -> IO ByteString
safedecomp Int
l ByteString
comp = do
let n :: Int64
n = Int -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
l
d :: ByteString
d = Int64 -> ByteString -> ByteString
BL.take Int64
n (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
decompress (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
BL.fromStrict ByteString
comp
if ByteString -> Int64
BL.length ByteString
d Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
/= Int64
n
then String -> IO ByteString
forall a. String -> IO a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"safedecomp: wrong length"
else ByteString -> IO ByteString
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ByteString -> IO ByteString) -> ByteString -> IO ByteString
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
B.toStrict ByteString
d