Borsh serialization for HexString

This commit is contained in:
Rene Vergara 2024-02-05 15:18:01 -06:00
parent 29eef5d5df
commit 4856ec516f
Signed by: pitmutt
GPG key ID: 65122AD495A7F5B2
6 changed files with 53 additions and 29 deletions

View file

@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- CHANGELOG.md - CHANGELOG.md
- Stack integration - Stack integration
- Borsh serialization for `HexString`
### Changed ### Changed

View file

@ -1,9 +1,4 @@
haskell-hexstring haskell-hexstring
================= =================
[![Build Status](https://travis-ci.org/solatis/haskell-hexstring.png?branch=master)](https://travis-ci.org/solatis/haskell-hexstring)
[![Coverage Status](https://coveralls.io/repos/solatis/haskell-hexstring/badge.svg?branch=master)](https://coveralls.io/r/solatis/haskell-hexstring?branch=master)
[![MIT](http://b.repl.ca/v1/license-MIT-blue.png)](http://en.wikipedia.org/wiki/MIT_License)
[![Haskell](http://b.repl.ca/v1/language-haskell-lightgrey.png)](http://haskell.org)
Fast and safe representation of a hex string Fast and safe representation of a hex string

View file

@ -35,7 +35,10 @@ library
, base >=4.7 && <5 , base >=4.7 && <5
, base16-bytestring , base16-bytestring
, binary , binary
, borsh >=0.2
, bytestring , bytestring
, foreign-rust
, generics-sop
, text , text
default-language: Haskell2010 default-language: Haskell2010

View file

@ -27,6 +27,9 @@ library:
- bytestring - bytestring
- base16-bytestring - base16-bytestring
- aeson - aeson
- generics-sop
- borsh >= 0.2
- foreign-rust
tests: tests:
hextring-test: hextring-test:

View file

@ -1,36 +1,53 @@
module Data.HexString ( HexString {-# LANGUAGE DeriveGeneric #-}
, hexString {-# LANGUAGE DuplicateRecordFields #-}
, fromBinary {-# LANGUAGE DeriveAnyClass #-}
, toBinary {-# LANGUAGE DerivingVia #-}
, fromBytes {-# LANGUAGE UndecidableInstances #-}
, toBytes {-# LANGUAGE OverloadedStrings #-}
, toText ) where
import Control.Applicative (pure) module Data.HexString
( HexString
, hexString
, fromBinary
, toBinary
, fromBytes
, toBytes
, toText
) where
import Data.Aeson import Codec.Borsh
import Data.Word (Word8) import Control.Applicative (pure)
import qualified Data.ByteString as BS import Data.Aeson
import Data.Word (Word8)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base16 as BS16 (decodeLenient, encode) import qualified Data.ByteString.Base16 as BS16 (decodeLenient, encode)
import qualified Data.ByteString.Lazy as BSL import qualified Data.ByteString.Lazy as BSL
import qualified Data.Text as T import Data.Structured
import qualified Data.Text.Encoding as TE import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
import qualified Data.Binary as B (Binary, decode, encode) import qualified Data.Binary as B (Binary, decode, encode)
import qualified GHC.Generics as GHC
import qualified Generics.SOP as SOP
-- | Represents a Hex string. Guarantees that all characters it contains -- | Represents a Hex string. Guarantees that all characters it contains
-- are valid hex characters. -- are valid hex characters.
data HexString = data HexString =
HexString BS.ByteString HexString BS.ByteString
deriving ( Show, Eq, Ord ) deriving stock (Prelude.Show, GHC.Generic)
deriving anyclass (SOP.Generic, SOP.HasDatatypeInfo)
deriving anyclass (Data.Structured.Show)
deriving (BorshSize, ToBorsh, FromBorsh) via AsStruct HexString
instance FromJSON HexString where instance FromJSON HexString where
parseJSON = withText "HexString" $ pure . hexString . TE.encodeUtf8 parseJSON = withText "HexString" $ pure . hexString . TE.encodeUtf8
instance ToJSON HexString where instance ToJSON HexString where
toJSON = String . toText toJSON = Data.Aeson.String . toText
-- | Smart constructor which validates that all the text are actually -- | Smart constructor which validates that all the text are actually
-- hexadecimal characters. -- hexadecimal characters.
@ -38,16 +55,15 @@ hexString :: BS.ByteString -> HexString
hexString bs = hexString bs =
let isValidHex :: Word8 -> Bool let isValidHex :: Word8 -> Bool
isValidHex c isValidHex c
| (48 <= c) && (c < 58) = True | (48 <= c) && (c < 58) = True
| (97 <= c) && (c < 103) = True | (97 <= c) && (c < 103) = True
| otherwise = False | otherwise = False
in if BS.all isValidHex bs
in if BS.all isValidHex bs then HexString bs
then HexString bs else error ("Not a valid hex string: " ++ Prelude.show bs)
else error ("Not a valid hex string: " ++ show bs)
-- | Converts a 'B.Binary' to a 'HexString' value -- | Converts a 'B.Binary' to a 'HexString' value
fromBinary :: B.Binary a => a -> HexString fromBinary :: B.Binary a => a -> HexString
fromBinary = hexString . BS16.encode . BSL.toStrict . B.encode fromBinary = hexString . BS16.encode . BSL.toStrict . B.encode
-- | Converts a 'HexString' to a 'B.Binary' value -- | Converts a 'HexString' to a 'B.Binary' value

View file

@ -2,3 +2,9 @@ resolver: lts-21.22
packages: packages:
- . - .
extra-deps:
- git: https://github.com/well-typed/borsh.git
commit: d2fcfa159e0a844b1ec5e8ed3e232d4b380fa831
- git: https://git.vergara.tech/Vergara_Tech/haskell-foreign-rust.git
commit: 787c2e813eb3a5d16c375d4b37dfefbd2adcdf05