packages feed

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

{-# LANGUAGE DeriveGeneric #-}

module Data.Multiaddr.UnixPath
  (
    UnixPath (..),
    toString,
    parse,
    encode,
    parseB
  ) where

import qualified Text.ParserCombinators.ReadP as Parser
import qualified Data.ByteString as BSStrict
import qualified Data.ByteString.Char8 as BSStrictChar
import qualified Data.Multiaddr.VarInt as VarInt

import GHC.Generics (Generic)
import System.FilePath (FilePath)
import Data.Serialize.Get (Get)

newtype UnixPath = UnixPath { path :: FilePath }
                 deriving (Show, Eq, Ord, Generic)

toString :: UnixPath -> String
toString (UnixPath p) = show p

parse :: Parser.ReadP UnixPath
parse = do
  path <- Parser.many1 Parser.get
  return $ UnixPath $ "/" ++ path

encode :: UnixPath -> BSStrict.ByteString
encode (UnixPath p) = VarInt.encodeWith $ BSStrictChar.pack p

parseB :: Get UnixPath
parseB = fmap (UnixPath . BSStrictChar.unpack) $ VarInt.decodeSizeVar