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
- Stack integration
- Borsh serialization for `HexString`
### Changed

View file

@ -1,9 +1,4 @@
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

View file

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

View file

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

View file

@ -1,11 +1,21 @@
module Data.HexString ( HexString
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE OverloadedStrings #-}
module Data.HexString
( HexString
, hexString
, fromBinary
, toBinary
, fromBytes
, toBytes
, toText ) where
, toText
) where
import Codec.Borsh
import Control.Applicative (pure)
import Data.Aeson
@ -15,22 +25,29 @@ import qualified Data.ByteString as BS
import qualified Data.ByteString.Base16 as BS16 (decodeLenient, encode)
import qualified Data.ByteString.Lazy as BSL
import Data.Structured
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
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
-- are valid hex characters.
data HexString =
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
parseJSON = withText "HexString" $ pure . hexString . TE.encodeUtf8
instance ToJSON HexString where
toJSON = String . toText
toJSON = Data.Aeson.String . toText
-- | Smart constructor which validates that all the text are actually
-- hexadecimal characters.
@ -41,10 +58,9 @@ hexString bs =
| (48 <= c) && (c < 58) = True
| (97 <= c) && (c < 103) = True
| otherwise = False
in if BS.all isValidHex bs
then HexString bs
else error ("Not a valid hex string: " ++ show bs)
else error ("Not a valid hex string: " ++ Prelude.show bs)
-- | Converts a 'B.Binary' to a 'HexString' value
fromBinary :: B.Binary a => a -> HexString

View file

@ -2,3 +2,9 @@ resolver: lts-21.22
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