module Archive.Tar ( Entry , Error , writeArchiveBytes , unpackToDir , readArchiveBytes , packFiles , versionInfo ) where import Codec.Archive.Tar (Entries (..)) import qualified Codec.Archive.Tar as Tar import Control.Composition ((.@)) import qualified Data.ByteString.Lazy as BSL import qualified Data.Version as V import qualified Paths_archive_tar as P type Entry = Tar.Entry type Error = Tar.FormatError -- this is bad but libarchive's error handling is vaguely fucked coerceToList :: Entries a -> Either a [Entry] coerceToList (Next e es) = (e :) <$> coerceToList es coerceToList Done = Right [] coerceToList (Fail ex) = Left ex writeArchiveBytes :: [Entry] -> BSL.ByteString writeArchiveBytes = Tar.write readArchiveBytes :: BSL.ByteString -> Either Error [Entry] readArchiveBytes = coerceToList . Tar.read unpackToDir :: FilePath -> BSL.ByteString -> IO () unpackToDir = Tar.read .@ Tar.unpack packFiles :: [FilePath] -> IO BSL.ByteString packFiles = fmap Tar.write . Tar.pack "." -- | @since 0.2.2.0 versionInfo :: String versionInfo = "tar: " ++ VERSION_tar ++ "\narchive-tar: " ++ V.showVersion P.version