mirror of https://github.com/voidlizard/hbs2
30 lines
823 B
Haskell
30 lines
823 B
Haskell
module HBS2.Data.Detect where
|
|
|
|
import HBS2.Prelude.Plated
|
|
import HBS2.Hash
|
|
import HBS2.Data.Types
|
|
import HBS2.Merkle
|
|
|
|
import Codec.Serialise (deserialiseOrFail)
|
|
import Data.ByteString.Lazy (ByteString)
|
|
import Data.Either
|
|
import Data.Function
|
|
import Data.Functor
|
|
|
|
data BlobType = Merkle (Hash HbSync)
|
|
| MerkleAnn (MTreeAnn [HashRef])
|
|
| AnnRef (Hash HbSync)
|
|
| Blob (Hash HbSync)
|
|
deriving (Show,Data)
|
|
|
|
|
|
tryDetect :: Hash HbSync -> ByteString -> BlobType
|
|
tryDetect hash obj = rights [mbAnn, mbLink, mbMerkle] & headDef orBlob
|
|
|
|
where
|
|
mbLink = deserialiseOrFail @AnnotatedHashRef obj >> pure (AnnRef hash)
|
|
mbMerkle = deserialiseOrFail @(MTree [HashRef]) obj >> pure (Merkle hash)
|
|
mbAnn = deserialiseOrFail obj <&> MerkleAnn
|
|
orBlob = Blob hash
|
|
|