module Resource.Compressed.Zstd where

import RIO

import RIO.FilePath (takeExtension)
import RIO.ByteString qualified as ByteString

import Codec.Compression.Zstd qualified as Zstd

data CompressedError
  = EmptyFile FilePath
  | ZstdError Text
  deriving (CompressedError -> CompressedError -> Bool
(CompressedError -> CompressedError -> Bool)
-> (CompressedError -> CompressedError -> Bool)
-> Eq CompressedError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CompressedError -> CompressedError -> Bool
$c/= :: CompressedError -> CompressedError -> Bool
== :: CompressedError -> CompressedError -> Bool
$c== :: CompressedError -> CompressedError -> Bool
Eq, Int -> CompressedError -> ShowS
[CompressedError] -> ShowS
CompressedError -> String
(Int -> CompressedError -> ShowS)
-> (CompressedError -> String)
-> ([CompressedError] -> ShowS)
-> Show CompressedError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CompressedError] -> ShowS
$cshowList :: [CompressedError] -> ShowS
show :: CompressedError -> String
$cshow :: CompressedError -> String
showsPrec :: Int -> CompressedError -> ShowS
$cshowsPrec :: Int -> CompressedError -> ShowS
Show)

instance Exception CompressedError

fromFileWith :: MonadIO m => (ByteString -> m b) -> (FilePath -> m b) -> FilePath -> m b
fromFileWith :: (ByteString -> m b) -> (String -> m b) -> String -> m b
fromFileWith ByteString -> m b
withBS String -> m b
withFilePath String
filePath
  | String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (ShowS
takeExtension String
filePath) [String]
compressedExts =
      (ByteString -> m b) -> String -> m b
forall (m :: * -> *) b.
MonadIO m =>
(ByteString -> m b) -> String -> m b
loadCompressed ByteString -> m b
withBS String
filePath
  | Bool
otherwise =
      String -> m b
withFilePath String
filePath

loadCompressed :: MonadIO m => (ByteString -> m b) -> FilePath -> m b
loadCompressed :: (ByteString -> m b) -> String -> m b
loadCompressed ByteString -> m b
withBS String
filePath = do
  ByteString
yeet'd <- String -> m ByteString
forall (m :: * -> *). MonadIO m => String -> m ByteString
ByteString.readFile String
filePath
  case ByteString -> Decompress
Zstd.decompress ByteString
yeet'd of
    Decompress
Zstd.Skip ->
      CompressedError -> m b
forall (m :: * -> *) e a. (MonadIO m, Exception e) => e -> m a
throwIO (CompressedError -> m b) -> CompressedError -> m b
forall a b. (a -> b) -> a -> b
$ String -> CompressedError
EmptyFile String
filePath
    Zstd.Error String
str ->
      CompressedError -> m b
forall (m :: * -> *) e a. (MonadIO m, Exception e) => e -> m a
throwIO (CompressedError -> m b) -> CompressedError -> m b
forall a b. (a -> b) -> a -> b
$ Text -> CompressedError
ZstdError (String -> Text
forall a. IsString a => String -> a
fromString String
str)
    Zstd.Decompress ByteString
buf ->
      ByteString -> m b
withBS ByteString
buf

compressedExts :: [FilePath]
compressedExts :: [String]
compressedExts =
  [ String
".zst"
  , String
".zstd"
  ]