packages feed

hs-multiaddr-0.1.0.0: src/Data/Multiaddr/IPFS.hs

module Data.Multiaddr.IPFS
  (
    MHD.MultihashDigest (..),
    toString,
    parse,
    encode,
    parseB
  ) where

import qualified Text.ParserCombinators.ReadP as Parser
import qualified Data.ByteString as BSStrict
import qualified Data.ByteString.Lazy as BSLazy
import qualified Data.ByteString.Lazy.Char8 as BSLazyChar
import qualified Data.Multiaddr.VarInt as VarInt
import qualified Data.Multihash.Digest as MHD
import qualified Data.Multihash.Base as MHB

import Data.Serialize.Get (Get)

toString :: MHD.MultihashDigest -> String
toString h =
  BSLazyChar.unpack $
  MHB.encode MHB.Base58
  (BSLazy.fromStrict $ MHD.digest h)

parse :: Parser.ReadP MHD.MultihashDigest
parse = do
  multihashText <- Parser.munch1 (/= '/')
  case ((MHB.decode MHB.Base58) (BSLazyChar.pack multihashText)) of
    Right bs ->
      case MHD.decode (BSLazyChar.toStrict bs) of
        Right digest -> return digest
        otherwise -> Parser.pfail
    otherwise -> Parser.pfail

encode :: MHD.MultihashDigest -> BSStrict.ByteString
encode h = VarInt.encodeWith $ MHD.digest h

parseB :: Get MHD.MultihashDigest
parseB = VarInt.decodeSizeVar >>= (either fail return . MHD.decode)