-- | This is a library for reading and writing TAR archives.
module Codec.Archive.Tar (
                          -- * TAR archive types
                          TarArchive(..),
                          TarEntry(..),
                          TarHeader(..),
                          TarFileType(..),
                          -- * Creating TAR archives
                          createTarFile,
                          createTarData,
                          createTarArchive,
                          createTarEntry,
                          recurseDirectories,
                          -- * Writing TAR archives
                          writeTarArchive,
                          writeTarFile,
                          -- * Extracting TAR archives
                          extractTarFile,
                          extractTarData,
                          extractTarArchive,
                          extractTarEntry,
                          -- * Reading TAR archives
                          readTarArchive,
                          readTarFile
                         ) where

import Codec.Archive.Tar.Create
import Codec.Archive.Tar.Extract
import Codec.Archive.Tar.Read
import Codec.Archive.Tar.Types
import Codec.Archive.Tar.Write

import Control.Monad (liftM)
import qualified Data.ByteString.Lazy.Char8 as L
import Data.ByteString.Lazy (ByteString)
import System.IO


-- | Creates a TAR archive containing a number of files
-- and directories, and write the archive to a file. 
--
-- See 'createTarArchive' and 'writeTarArchive' for more information.
createTarFile :: FilePath   -- ^ File to write the archive to.
              -> [FilePath] -- ^ Files and directories to include in the archive.
              -> IO ()
createTarFile f fs = createTarData fs >>= L.writeFile f

-- | Creates a TAR archive containing a number of files
-- and directories, and returns the archive as a lazy ByteString.
--
-- See 'createTarArchive' and 'writeTarArchive' for more information.
createTarData :: [FilePath]    -- ^ Files and directories to include in the archive.
              -> IO ByteString
createTarData = liftM writeTarArchive . createTarArchive 

-- | Writes a TAR archive to a file.
--
-- See 'writeTarArchive' for more information.
writeTarFile :: FilePath   -- ^ The file to write the archive to.
             -> TarArchive -- ^ The archive to write out.
             -> IO ()
writeTarFile f = L.writeFile f . writeTarArchive


-- | Reads a TAR archive from a file.
--
-- See 'readTarArchive' for more information.
readTarFile :: FilePath -- ^ File to read the archive from.
            -> IO TarArchive
readTarFile = liftM readTarArchive . L.readFile


-- | Reads a TAR archive from a file and extracts its contents into
-- the current directory.
--
-- See 'readTarArchive' and 'extractTarArchive' for more information.
extractTarFile :: FilePath -- ^ File from which the archive is read.
               -> IO ()
extractTarFile f = L.readFile f >>= extractTarData

-- | Reads a TAR archive from a lazy ByteString and extracts its contents into
-- the current directory.
--
-- See 'readTarArchive' and 'extractTarArchive' for more information.
extractTarData :: ByteString -- ^ Data from which the archive is read.
               -> IO ()
extractTarData = extractTarArchive . readTarArchive