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