@@ -28,8 +28,11 @@ module Network.Ethereum.Core.HexString
2828
2929import Prelude
3030
31+ import Data.Argonaut as A
3132import Data.Array (uncons , unsafeIndex , replicate )
3233import Data.ByteString (ByteString , toString , fromString ) as BS
34+ import Data.Either (Either (..), either )
35+ import Data.Foreign (ForeignError (..), fail )
3336import Data.Foreign.Class (class Decode , class Encode , decode , encode )
3437import Data.Int (even )
3538import Data.Maybe (Maybe (..), fromJust , isJust )
@@ -40,7 +43,7 @@ import Data.String as S
4043import Network.Ethereum.Core.BigNumber (BigNumber , toString , hexadecimal )
4144import Node.Encoding (Encoding (Hex, UTF8, ASCII))
4245import Partial.Unsafe (unsafePartial )
43- import Simple.JSON (class ReadForeign )
46+ import Simple.JSON (class ReadForeign , class WriteForeign )
4447
4548-- ------------------------------------------------------------------------------
4649-- * Signed Values
@@ -87,18 +90,35 @@ derive newtype instance hexStringOrd :: Ord HexString
8790derive newtype instance semigpStringEq :: Semigroup HexString
8891derive newtype instance monoidStringEq :: Monoid HexString
8992
93+ _encode :: HexString -> String
94+ _encode = append " 0x" <<< unHex
95+
96+ _decode :: String -> Either String HexString
97+ _decode str = case mkHexString str of
98+ Just res -> Right res
99+ Nothing -> Left $ " Failed to parse as HexString: " <> str
100+
90101instance decodeHexString :: Decode HexString where
91102 decode s = do
92103 str <- decode s
93- case stripPrefix (Pattern " 0x" ) str of
94- Nothing -> pure <<< HexString $ str
95- Just res -> pure <<< HexString $ res
104+ either (fail <<< ForeignError ) pure $ _decode str
96105
97106instance readFHexString :: ReadForeign HexString where
98107 readImpl = decode
99108
109+ instance writeFHexString :: WriteForeign HexString where
110+ writeImpl = encode
111+
100112instance encodeHexString :: Encode HexString where
101- encode = encode <<< append " 0x" <<< unHex
113+ encode = encode <<< _encode
114+
115+ instance decodeJsonHexString :: A.DecodeJson HexString where
116+ decodeJson json = do
117+ str <- A .decodeJson json
118+ _decode str
119+
120+ instance encodeJsonHexString :: A.EncodeJson HexString where
121+ encodeJson = A .encodeJson <<< _encode
102122
103123unHex :: HexString -> String
104124unHex (HexString hx) = hx
0 commit comments