module Codec.Archive.Zip.Conduit.Types where
import Control.Exception (Exception(..))
import Data.ByteString (ByteString)
import qualified Data.ByteString.Lazy as BSL
import qualified Data.Conduit as C
import Data.Conduit.Binary (sourceLbs)
import Data.Semigroup (Semigroup(..))
import Data.String (IsString(..))
import qualified Data.Text as T
import Data.Time.LocalTime (LocalTime)
import Data.Typeable (Typeable)
import Data.Word (Word32, Word64)
newtype ZipError = ZipError String
deriving (Show, Typeable)
instance IsString ZipError where
fromString = ZipError
instance Exception ZipError where
displayException (ZipError e) = "ZipError: " ++ e
data ZipInfo = ZipInfo
{ zipComment :: ByteString
} deriving (Eq, Show)
data ZipEntry = ZipEntry
{ zipEntryName :: Either T.Text ByteString
, zipEntryTime :: LocalTime
, zipEntrySize :: Maybe Word64
, zipEntryExternalAttributes :: Maybe Word32
} deriving (Eq, Show)
data ZipData m
= ZipDataByteString BSL.ByteString
| ZipDataSource (C.ConduitM () ByteString m ())
instance Monad m => Semigroup (ZipData m) where
ZipDataByteString a <> ZipDataByteString b = ZipDataByteString $ mappend a b
a <> b = ZipDataSource $ mappend (sourceZipData a) (sourceZipData b)
instance Monad m => Monoid (ZipData m) where
mempty = ZipDataByteString BSL.empty
mappend = (<>)
sourceZipData :: Monad m => ZipData m -> C.ConduitM () ByteString m ()
sourceZipData (ZipDataByteString b) = sourceLbs b
sourceZipData (ZipDataSource s) = s