archive-tar-1.0.0.0: src/Archive/Tar.cpphs
module Archive.Tar ( Entry
, Error
, FP
, writeArchiveBytes
, unpackToDirRaw
, readArchiveBytes
, packFilesRaw
, versionInfo
, toFP
) where
import Codec.Archive.Tar (Entries, GenEntries (..))
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
type FP = FilePath
toFP :: FilePath -> FP
toFP = id
-- 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
unpackToDirRaw :: FP -> BSL.ByteString -> IO ()
unpackToDirRaw = Tar.read .@ Tar.unpack
packFilesRaw :: [FP] -> IO BSL.ByteString
packFilesRaw = fmap Tar.write . Tar.pack "."
-- | @since 0.2.2.0
versionInfo :: String
versionInfo = "tar: " ++ VERSION_tar ++ "\narchive-tar: " ++ V.showVersion P.version