Add Encode typeclass

This commit is contained in:
Alexander Kobjolke 2023-10-17 15:27:39 +02:00
parent 5d02a9e424
commit 6dc02d4d3a
8 changed files with 214 additions and 16 deletions

42
src/FilePack/FileData.hs Normal file
View file

@ -0,0 +1,42 @@
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