{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
module Network.GRPC.Spec.Compression (
Compression(..)
, noCompression
, gzip
, allSupportedCompression
, compressionIsIdentity
, CompressionId(..)
, serializeCompressionId
, deserializeCompressionId
) where
import Codec.Compression.GZip qualified as GZip
import Codec.Compression.Zlib qualified as Deflate
import Data.ByteString qualified as Strict (ByteString)
import Data.ByteString.Lazy qualified as Lazy (ByteString)
import Data.ByteString.UTF8 qualified as BS.Strict.UTF8
import Data.Int (Int64)
import Data.List.NonEmpty (NonEmpty(..))
import Data.String
import GHC.Generics (Generic)
#ifdef SNAPPY
import Codec.Compression.SnappyC.Framed qualified as Snappy
#endif
data Compression = Compression {
Compression -> CompressionId
compressionId :: CompressionId
, Compression -> ByteString -> ByteString
compress :: Lazy.ByteString -> Lazy.ByteString
, Compression -> ByteString -> ByteString
decompress :: Lazy.ByteString -> Lazy.ByteString
, Compression -> Int64 -> Bool
uncompressedSizeThreshold :: Int64 -> Bool
}
instance Show Compression where
show :: Compression -> String
show Compression{CompressionId
compressionId :: Compression -> CompressionId
compressionId :: CompressionId
compressionId} = String
"<Compression " String -> ShowS
forall a. [a] -> [a] -> [a]
++ CompressionId -> String
forall a. Show a => a -> String
show CompressionId
compressionId String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
">"
allSupportedCompression :: NonEmpty Compression
allSupportedCompression :: NonEmpty Compression
allSupportedCompression =
Compression
gzip Compression -> [Compression] -> NonEmpty Compression
forall a. a -> [a] -> NonEmpty a
:|
[ Compression
deflate
#ifdef SNAPPY
, Compression
snappy
#endif
, Compression
noCompression
]
data CompressionId =
Identity
| GZip
| Deflate
| Snappy
| Custom String
deriving stock (CompressionId -> CompressionId -> Bool
(CompressionId -> CompressionId -> Bool)
-> (CompressionId -> CompressionId -> Bool) -> Eq CompressionId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CompressionId -> CompressionId -> Bool
== :: CompressionId -> CompressionId -> Bool
$c/= :: CompressionId -> CompressionId -> Bool
/= :: CompressionId -> CompressionId -> Bool
Eq, Eq CompressionId
Eq CompressionId =>
(CompressionId -> CompressionId -> Ordering)
-> (CompressionId -> CompressionId -> Bool)
-> (CompressionId -> CompressionId -> Bool)
-> (CompressionId -> CompressionId -> Bool)
-> (CompressionId -> CompressionId -> Bool)
-> (CompressionId -> CompressionId -> CompressionId)
-> (CompressionId -> CompressionId -> CompressionId)
-> Ord CompressionId
CompressionId -> CompressionId -> Bool
CompressionId -> CompressionId -> Ordering
CompressionId -> CompressionId -> CompressionId
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: CompressionId -> CompressionId -> Ordering
compare :: CompressionId -> CompressionId -> Ordering
$c< :: CompressionId -> CompressionId -> Bool
< :: CompressionId -> CompressionId -> Bool
$c<= :: CompressionId -> CompressionId -> Bool
<= :: CompressionId -> CompressionId -> Bool
$c> :: CompressionId -> CompressionId -> Bool
> :: CompressionId -> CompressionId -> Bool
$c>= :: CompressionId -> CompressionId -> Bool
>= :: CompressionId -> CompressionId -> Bool
$cmax :: CompressionId -> CompressionId -> CompressionId
max :: CompressionId -> CompressionId -> CompressionId
$cmin :: CompressionId -> CompressionId -> CompressionId
min :: CompressionId -> CompressionId -> CompressionId
Ord, (forall x. CompressionId -> Rep CompressionId x)
-> (forall x. Rep CompressionId x -> CompressionId)
-> Generic CompressionId
forall x. Rep CompressionId x -> CompressionId
forall x. CompressionId -> Rep CompressionId x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. CompressionId -> Rep CompressionId x
from :: forall x. CompressionId -> Rep CompressionId x
$cto :: forall x. Rep CompressionId x -> CompressionId
to :: forall x. Rep CompressionId x -> CompressionId
Generic)
serializeCompressionId :: CompressionId -> Strict.ByteString
serializeCompressionId :: CompressionId -> ByteString
serializeCompressionId CompressionId
Identity = ByteString
"identity"
serializeCompressionId CompressionId
GZip = ByteString
"gzip"
serializeCompressionId CompressionId
Deflate = ByteString
"deflate"
serializeCompressionId CompressionId
Snappy = ByteString
"snappy"
serializeCompressionId (Custom String
i) = String -> ByteString
BS.Strict.UTF8.fromString String
i
deserializeCompressionId :: Strict.ByteString -> CompressionId
deserializeCompressionId :: ByteString -> CompressionId
deserializeCompressionId ByteString
"identity" = CompressionId
Identity
deserializeCompressionId ByteString
"gzip" = CompressionId
GZip
deserializeCompressionId ByteString
"deflate" = CompressionId
Deflate
deserializeCompressionId ByteString
"snappy" = CompressionId
Snappy
deserializeCompressionId ByteString
i = String -> CompressionId
Custom (ByteString -> String
BS.Strict.UTF8.toString ByteString
i)
instance Show CompressionId where
show :: CompressionId -> String
show = ByteString -> String
BS.Strict.UTF8.toString (ByteString -> String)
-> (CompressionId -> ByteString) -> CompressionId -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CompressionId -> ByteString
serializeCompressionId
instance IsString CompressionId where
fromString :: String -> CompressionId
fromString = ByteString -> CompressionId
deserializeCompressionId (ByteString -> CompressionId)
-> (String -> ByteString) -> String -> CompressionId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
BS.Strict.UTF8.fromString
compressionIsIdentity :: Compression -> Bool
compressionIsIdentity :: Compression -> Bool
compressionIsIdentity = (CompressionId -> CompressionId -> Bool
forall a. Eq a => a -> a -> Bool
== CompressionId
Identity) (CompressionId -> Bool)
-> (Compression -> CompressionId) -> Compression -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Compression -> CompressionId
compressionId
noCompression :: Compression
noCompression :: Compression
noCompression = Compression {
compressionId :: CompressionId
compressionId = CompressionId
Identity
, compress :: ByteString -> ByteString
compress = ByteString -> ByteString
forall a. a -> a
id
, decompress :: ByteString -> ByteString
decompress = ByteString -> ByteString
forall a. a -> a
id
, uncompressedSizeThreshold :: Int64 -> Bool
uncompressedSizeThreshold = Bool -> Int64 -> Bool
forall a b. a -> b -> a
const Bool
False
}
gzip :: Compression
gzip :: Compression
gzip = Compression {
compressionId :: CompressionId
compressionId = CompressionId
GZip
, compress :: ByteString -> ByteString
compress = ByteString -> ByteString
GZip.compress
, decompress :: ByteString -> ByteString
decompress = ByteString -> ByteString
GZip.decompress
, uncompressedSizeThreshold :: Int64 -> Bool
uncompressedSizeThreshold = (Int64 -> Int64 -> Bool
forall a. Ord a => a -> a -> Bool
>= Int64
27)
}
deflate :: Compression
deflate :: Compression
deflate = Compression {
compressionId :: CompressionId
compressionId = CompressionId
Deflate
, compress :: ByteString -> ByteString
compress = ByteString -> ByteString
Deflate.compress
, decompress :: ByteString -> ByteString
decompress = ByteString -> ByteString
Deflate.decompress
, uncompressedSizeThreshold :: Int64 -> Bool
uncompressedSizeThreshold = (Int64 -> Int64 -> Bool
forall a. Ord a => a -> a -> Bool
>= Int64
13)
}
#ifdef SNAPPY
snappy :: Compression
snappy :: Compression
snappy = Compression {
compressionId :: CompressionId
compressionId = CompressionId
Snappy
, compress :: ByteString -> ByteString
compress = ByteString -> ByteString
Snappy.compress
, decompress :: ByteString -> ByteString
decompress = HasCallStack => ByteString -> ByteString
ByteString -> ByteString
Snappy.decompress
, uncompressedSizeThreshold :: Int64 -> Bool
uncompressedSizeThreshold = (Int64 -> Int64 -> Bool
forall a. Ord a => a -> a -> Bool
>= Int64
28)
}
#endif