Add Identity Multibase
Some checks failed
Hydra checks.aarch64-darwin.treefmt Hydra build #48478 of flakes:matrix-media-expanded:checks.aarch64-darwin.treefmt
Hydra checks.aarch64-linux.default-hls Hydra build #48479 of flakes:matrix-media-expanded:checks.aarch64-linux.default-hls
Hydra packages.aarch64-linux.default Hydra build #48483 of flakes:matrix-media-expanded:packages.aarch64-linux.default
Hydra packages.x86_64-linux.default Hydra build #48484 of flakes:matrix-media-expanded:packages.x86_64-linux.default
Hydra checks.x86_64-linux.treefmt Hydra build #48482 of flakes:matrix-media-expanded:checks.x86_64-linux.treefmt
Hydra devShells.x86_64-linux.default Hydra build #48480 of flakes:matrix-media-expanded:devShells.x86_64-linux.default
Hydra checks.x86_64-linux.default-hls Hydra build #48481 of flakes:matrix-media-expanded:checks.x86_64-linux.default-hls
Hydra checks.x86_64-darwin.treefmt Hydra build #48485 of flakes:matrix-media-expanded:checks.x86_64-darwin.treefmt
Hydra devShells.aarch64-linux.default Hydra build #48486 of flakes:matrix-media-expanded:devShells.aarch64-linux.default
Hydra checks.aarch64-linux.treefmt Hydra build #48476 of flakes:matrix-media-expanded:checks.aarch64-linux.treefmt
Hydra packages.x86_64-linux.matrix-media-expanded Hydra build #48475 of flakes:matrix-media-expanded:packages.x86_64-linux.matrix-media-expanded
Hydra packages.aarch64-linux.matrix-media-expanded Hydra build #48477 of flakes:matrix-media-expanded:packages.aarch64-linux.matrix-media-expanded

This commit is contained in:
Charlotte 🦝 Delenk 2023-06-10 15:12:37 +01:00
parent 5c083d4419
commit f5fda366a1
Signed by: darkkirb
GPG key ID: AB2BD8DAF2E37122
9 changed files with 121 additions and 1 deletions

View file

@ -141,7 +141,7 @@
};
flake = {
hydraJobs = {
inherit (inputs.self) packages devShells;
inherit (inputs.self) packages devShells checks;
};
};
};

View file

@ -85,12 +85,38 @@ common shared
, profunctors
, relude >=1.0
, shower
, text
, time
, with-utf8
hs-source-dirs: src
default-language: Haskell2010
library
import: shared
exposed-modules:
Codec.Multibase
, Codec.Multibase.Error
, Codec.Multibase.Identity
executable matrix-media-expanded
import: shared
main-is: Main.hs
test-suite test
import: shared
build-depends:
, tasty
, tasty-smallcheck
, tasty-quickcheck
, tasty-hunit
type: exitcode-stdio-1.0
hs-source-dirs: test
main-is: Test.hs
ghc-options: -main-is Test
other-modules:
Codec.Multibase.Error
, Codec.Multibase.Identity
, Test.Codec
, Test.Codec.Multibase
, Test.Codec.Multibase.Identity

10
src/Codec/Multibase.hs Normal file
View file

@ -0,0 +1,10 @@
module Codec.Multibase where
import Codec.Multibase.Identity qualified as Identity
import Data.ByteString.Builder (toLazyByteString)
import Data.ByteString.Lazy (ByteString)
import Prelude hiding (ByteString)
-- | Encode Bytes as a Multibase bytestring, using the most space efficient encoding. Unlike other formats, this does not return Text in any encoding.
encodeToMultihashBytes :: ByteString -> ByteString
encodeToMultihashBytes = toLazyByteString . Identity.encode

View file

@ -0,0 +1,4 @@
module Codec.Multibase.Error where
data ParseError = UnknownMulticodec | InvalidValue
deriving stock (Show, Eq)

View file

@ -0,0 +1,17 @@
module Codec.Multibase.Identity where
import Codec.Multibase.Error (ParseError (UnknownMulticodec))
import Data.ByteString.Builder (Builder, lazyByteString, word8)
import Data.ByteString.Lazy (ByteString)
import Data.ByteString.Lazy qualified as B
import Prelude hiding (ByteString)
-- | Encodes a ByteString as Multiformat identity
encode :: ByteString -> Builder
encode v = word8 0 <> lazyByteString v
-- | Attempts to decode a ByteString as Multiformat identity
decode :: ByteString -> Either ParseError ByteString
decode v = case B.head v of
0 -> Right $ B.tail v
_ -> Left UnknownMulticodec

11
test/Test.hs Normal file
View file

@ -0,0 +1,11 @@
module Test where
import Main.Utf8 qualified as Utf8
import Test.Codec qualified as Codec
import Test.Tasty (TestTree, defaultMain, testGroup)
main :: IO ()
main = Utf8.withUtf8 $ defaultMain tests
tests :: TestTree
tests = testGroup "Tests" [Codec.tests]

7
test/Test/Codec.hs Normal file
View file

@ -0,0 +1,7 @@
module Test.Codec where
import Test.Codec.Multibase qualified as Multibase
import Test.Tasty (TestTree, testGroup)
tests :: TestTree
tests = testGroup "Codec" [Multibase.tests]

View file

@ -0,0 +1,7 @@
module Test.Codec.Multibase where
import Test.Codec.Multibase.Identity qualified as Identity
import Test.Tasty (TestTree, testGroup)
tests :: TestTree
tests = testGroup "Multibase" [Identity.tests]

View file

@ -0,0 +1,38 @@
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
{-# HLINT ignore "Use alternative" #-}
module Test.Codec.Multibase.Identity where
import Codec.Multibase.Identity
import Data.ByteString.Builder (toLazyByteString)
import Data.ByteString.Lazy qualified as B
import Test.Tasty
import Test.Tasty.HUnit
import Test.Tasty.SmallCheck as SC
tests :: TestTree
tests = testGroup "Identity" [scProps, unitTests]
encode' :: B.ByteString -> B.ByteString
encode' = toLazyByteString . encode
scProps :: TestTree
scProps =
testGroup
"SmallCheck"
[ SC.testProperty "decode . encode == id" $ \list ->
let lazyList = B.pack list
in decode (encode' lazyList) == Right lazyList
]
unitTests :: TestTree
unitTests =
testGroup
"Unit Tests"
[ testCase "Encoding the string 'yes mani !'" $ encode' "yes mani !" @?= "\0yes mani !"
, testCase "Decoding the Multibase '\\0yes mani !'" $ decode "\0yes mani !" @?= Right "yes mani !"
, testCase "Encoding the string '\\0yes mani !'" $ encode' "\0yes mani !" @?= "\0\0yes mani !"
, testCase "Decoding the Multibase '\\0\\0yes mani !'" $ decode "\0\0yes mani !" @?= Right "\0yes mani !"
, testCase "Encoding the string '\\0\\0yes mani !'" $ encode' "\0\0yes mani !" @?= "\0\0\0yes mani !"
, testCase "Decoding the Multibase '\\0\\0\\0yes mani !'" $ decode "\0\0\0yes mani !" @?= Right "\0\0yes mani !"
]