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
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:
parent
5c083d4419
commit
f5fda366a1
9 changed files with 121 additions and 1 deletions
|
@ -141,7 +141,7 @@
|
||||||
};
|
};
|
||||||
flake = {
|
flake = {
|
||||||
hydraJobs = {
|
hydraJobs = {
|
||||||
inherit (inputs.self) packages devShells;
|
inherit (inputs.self) packages devShells checks;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -85,12 +85,38 @@ common shared
|
||||||
, profunctors
|
, profunctors
|
||||||
, relude >=1.0
|
, relude >=1.0
|
||||||
, shower
|
, shower
|
||||||
|
, text
|
||||||
, time
|
, time
|
||||||
, with-utf8
|
, with-utf8
|
||||||
|
|
||||||
hs-source-dirs: src
|
hs-source-dirs: src
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|
||||||
|
library
|
||||||
|
import: shared
|
||||||
|
exposed-modules:
|
||||||
|
Codec.Multibase
|
||||||
|
, Codec.Multibase.Error
|
||||||
|
, Codec.Multibase.Identity
|
||||||
|
|
||||||
executable matrix-media-expanded
|
executable matrix-media-expanded
|
||||||
import: shared
|
import: shared
|
||||||
main-is: Main.hs
|
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
10
src/Codec/Multibase.hs
Normal 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
|
4
src/Codec/Multibase/Error.hs
Normal file
4
src/Codec/Multibase/Error.hs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
module Codec.Multibase.Error where
|
||||||
|
|
||||||
|
data ParseError = UnknownMulticodec | InvalidValue
|
||||||
|
deriving stock (Show, Eq)
|
17
src/Codec/Multibase/Identity.hs
Normal file
17
src/Codec/Multibase/Identity.hs
Normal 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
11
test/Test.hs
Normal 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
7
test/Test/Codec.hs
Normal 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]
|
7
test/Test/Codec/Multibase.hs
Normal file
7
test/Test/Codec/Multibase.hs
Normal 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]
|
38
test/Test/Codec/Multibase/Identity.hs
Normal file
38
test/Test/Codec/Multibase/Identity.hs
Normal 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 !"
|
||||||
|
]
|
Loading…
Reference in a new issue