Update Hexstring for binary #1
6 changed files with 53 additions and 29 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -35,7 +35,10 @@ library
|
|||
, base >=4.7 && <5
|
||||
, base16-bytestring
|
||||
, binary
|
||||
, borsh >=0.2
|
||||
, bytestring
|
||||
, foreign-rust
|
||||
, generics-sop
|
||||
, text
|
||||
default-language: Haskell2010
|
||||
|
||||
|
|
|
@ -27,6 +27,9 @@ library:
|
|||
- bytestring
|
||||
- base16-bytestring
|
||||
- aeson
|
||||
- generics-sop
|
||||
- borsh >= 0.2
|
||||
- foreign-rust
|
||||
|
||||
tests:
|
||||
hextring-test:
|
||||
|
|
|
@ -1,36 +1,53 @@
|
|||
module Data.HexString ( HexString
|
||||
, hexString
|
||||
, fromBinary
|
||||
, toBinary
|
||||
, fromBytes
|
||||
, toBytes
|
||||
, toText ) where
|
||||
{-# LANGUAGE DeriveGeneric #-}
|
||||
{-# LANGUAGE DuplicateRecordFields #-}
|
||||
{-# LANGUAGE DeriveAnyClass #-}
|
||||
{-# LANGUAGE DerivingVia #-}
|
||||
{-# LANGUAGE UndecidableInstances #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
import Control.Applicative (pure)
|
||||
module Data.HexString
|
||||
( HexString
|
||||
, hexString
|
||||
, fromBinary
|
||||
, toBinary
|
||||
, fromBytes
|
||||
, toBytes
|
||||
, toText
|
||||
) where
|
||||
|
||||
import Data.Aeson
|
||||
import Data.Word (Word8)
|
||||
import Codec.Borsh
|
||||
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.Lazy as BSL
|
||||
import qualified Data.ByteString.Lazy as BSL
|
||||
|
||||
import qualified Data.Text as T
|
||||
import qualified Data.Text.Encoding as TE
|
||||
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 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.
|
||||
|
@ -38,16 +55,15 @@ hexString :: BS.ByteString -> HexString
|
|||
hexString bs =
|
||||
let isValidHex :: Word8 -> Bool
|
||||
isValidHex c
|
||||
| (48 <= c) && (c < 58) = True
|
||||
| (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)
|
||||
| otherwise = False
|
||||
in if BS.all isValidHex bs
|
||||
then HexString 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
|
||||
fromBinary :: B.Binary a => a -> HexString
|
||||
fromBinary = hexString . BS16.encode . BSL.toStrict . B.encode
|
||||
|
||||
-- | Converts a 'HexString' to a 'B.Binary' value
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue