{-# LANGUAGE OverloadedStrings #-} module Test.Util ( Example (..), decodeFromHex, parseHex, ) where import Control.Monad ((>=>)) import Data.Aeson (FromJSON (..), withObject, (.:)) import Data.Aeson.Types (Parser) import Data.ByteString (ByteString) import Data.Serialize (Serialize, decode) import Data.Text (Text) import Haskoin.Block (Block, BlockHash, BlockHeight) import qualified Haskoin.Util as U import Bitcoin.CompactFilter ( BlockFilter, BlockFilterHeader, filterHeaderFromHex, ) decodeFromHex :: Serialize a => Text -> Either String a decodeFromHex = parseHex >=> decode parseHex :: Text -> Either String ByteString parseHex = maybe (Left "Bad hex") Right . U.decodeHex data Example = Example { exampleHeight :: BlockHeight , exampleBlockHash :: BlockHash , exampleBlock :: Block , examplePrevOuts :: [ByteString] , exampleFilter :: BlockFilter , examplePrevHeader :: BlockFilterHeader , exampleHeader :: BlockFilterHeader } deriving (Eq, Show) instance FromJSON Example where parseJSON = withObject "Example" $ \obj -> Example <$> obj .: "height" <*> (fromHex =<< obj .: "block_hash") <*> (fromHex =<< obj .: "block") <*> (either fail return . traverse parseHex =<< obj .: "prev_outs") <*> (fromHex =<< obj .: "filter") <*> (either fail return . filterHeaderFromHex =<< obj .: "prev_filter_header") <*> (either fail return . filterHeaderFromHex =<< obj .: "filter_header") fromHex :: Serialize a => Text -> Parser a fromHex = either fail return . decodeFromHex