42 lines
1.3 KiB
Haskell
42 lines
1.3 KiB
Haskell
module FilePack.FileData where
|
|
|
|
import Data.ByteString (ByteString)
|
|
|
|
import Data.Text (Text)
|
|
|
|
import Data.ByteString.Base64 qualified as B64
|
|
import Data.ByteString.Char8 qualified as BC
|
|
import GHC.Natural (Natural)
|
|
import System.Posix.Types (CMode (..), FileMode)
|
|
import Text.Read (readEither)
|
|
|
|
import FilePack.Encode ()
|
|
|
|
data FileData = FileData
|
|
{ fileName :: Text
|
|
, fileSize :: Natural
|
|
, filePermissions :: FileMode
|
|
, fileData :: ByteString
|
|
}
|
|
deriving (Eq, Read, Show)
|
|
|
|
newtype FilePack = FilePack {getPackedFiles :: [FileData]}
|
|
deriving (Eq, Read, Show)
|
|
|
|
{- | @packFiles@ takes a FilePack and encodes it into a serialized form.
|
|
|
|
>>> import Data.Text qualified as T
|
|
>>> import Data.ByteString qualified as BS
|
|
>>> import System.Posix.Files (stdFileMode)
|
|
>>> let sampleFileData = FileData{fileName=T.pack "foo.txt", fileSize = 1024, filePermissions = stdFileMode, fileData = BS.empty}
|
|
>>> let sampleFilePack = FilePack [sampleFileData]
|
|
>>> (Right sampleFilePack) == (unpackFiles . packFiles $ sampleFilePack)
|
|
True
|
|
-}
|
|
packFiles :: FilePack -> ByteString
|
|
packFiles = B64.encode . BC.pack . show
|
|
|
|
-- | @unpackFiles@ tries to recover a FilePack from its serialized form.
|
|
unpackFiles :: ByteString -> Either String FilePack
|
|
unpackFiles serializedData =
|
|
B64.decode serializedData >>= readEither . BC.unpack
|