module Codec.Archive.Types (
Archive
, ArchiveEntry
, Stat
, LinkResolver
, Entry (..)
, EntryContent (..)
, Ownership (..)
, ModTime
, Id
, Permissions
, ArchiveEncryption (..)
, Flags (..)
, ArchiveError (..)
, ArchiveFilter (..)
, ArchiveFormat (..)
, FileType (..)
, ArchiveCapabilities (..)
, ReadDiskFlags (..)
, TimeFlag (..)
, EntryACL (..)
, standardPermissions
, executablePermissions
) where
import Data.Bits (Bits (..))
import qualified Data.ByteString as BS
import Data.Int (Int64)
import Data.Semigroup
import Foreign.C.Types (CInt, CLong, CTime)
import System.Posix.Types (CMode (..))
data Archive
data ArchiveEntry
data Stat
data LinkResolver
data EntryContent = NormalFile !BS.ByteString
| Directory
| Symlink !FilePath
data Entry = Entry { filepath :: !FilePath
, content :: !EntryContent
, permissions :: !Permissions
, ownership :: !Ownership
, time :: !ModTime
}
data Ownership = Ownership { userName :: !String
, groupName :: !String
, ownerId :: !Id
, groupId :: !Id
}
type Permissions = CMode
type ModTime = (CTime, CLong)
type Id = Int64
standardPermissions :: Permissions
standardPermissions = 0o644
executablePermissions :: Permissions
executablePermissions = 0o755
newtype ArchiveFormat = ArchiveFormat CInt
deriving (Eq)
newtype FileType = FileType CMode
deriving (Eq)
newtype ArchiveError = ArchiveError CInt
deriving (Eq)
newtype Flags = Flags CInt
newtype ReadDiskFlags = ReadDiskFlags CInt
newtype TimeFlag = TimeFlag CInt
newtype EntryACL = EntryACL CInt
newtype ArchiveFilter = ArchiveFilter CInt
newtype ArchiveCapabilities = ArchiveCapabilities CInt
deriving (Eq)
data ArchiveEncryption = HasEncryption
| NoEncryption
| EncryptionUnsupported
| EncryptionUnknown
instance Semigroup ArchiveCapabilities where
(<>) (ArchiveCapabilities x) (ArchiveCapabilities y) = ArchiveCapabilities (x .|. y)
instance Monoid ArchiveCapabilities where
mempty = ArchiveCapabilities 0
mappend = (<>)
instance Semigroup ReadDiskFlags where
(<>) (ReadDiskFlags x) (ReadDiskFlags y) = ReadDiskFlags (x .|. y)
instance Semigroup Flags where
(<>) (Flags x) (Flags y) = Flags (x .|. y)
instance Monoid Flags where
mempty = Flags 0
mappend = (<>)
instance Semigroup EntryACL where
(<>) (EntryACL x) (EntryACL y) = EntryACL (x .|. y)