packages feed

api-rpc-accumulate-0.1.0.0: src/Accumulate/RPC/Types/ApiDataResponse.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StrictData #-}

module Accumulate.RPC.Types.ApiDataResponse
  ( APIDataResponse (..),
    Data (..),
    decodeApiData,
  )
where

import Data.Aeson
import Data.Aeson.Types (emptyObject)
import Data.ByteString.Lazy (ByteString)
import Data.HashMap.Strict (HashMap)
import Data.Text (Text)

--------------------------------------------------------------------------------

data APIDataResponse = APIDataResponse
  { apiDataResponseDataAPIDataResponse :: Maybe Data,
    sponsorAPIDataResponse :: Maybe Text,
    keyPageAPIDataResponse :: Maybe (Maybe Text),
    mdRootAPIDataResponse :: Maybe Text,
    apiDataResponseTypeAPIDataResponse :: Maybe Text
  }
  deriving (Show)

data Data = Data
  { txCountData :: Maybe Int,
    urlData :: Maybe Text,
    balanceData :: Maybe Text,
    keyBookURLData :: Maybe Text,
    tokenURLData :: Maybe Text,
    creditBalanceData :: Maybe Text,
    nonceData :: Maybe Int
  }
  deriving (Show)

decodeApiData :: ByteString -> Maybe APIDataResponse
decodeApiData = decode

instance ToJSON APIDataResponse where
  toJSON (APIDataResponse apiDataResponseDataAPIDataResponse sponsorAPIDataResponse keyPageAPIDataResponse mdRootAPIDataResponse apiDataResponseTypeAPIDataResponse) =
    object
      [ "data" .= apiDataResponseDataAPIDataResponse,
        "sponsor" .= sponsorAPIDataResponse,
        "keyPage" .= keyPageAPIDataResponse,
        "mdRoot" .= mdRootAPIDataResponse,
        "type" .= apiDataResponseTypeAPIDataResponse
      ]

instance FromJSON APIDataResponse where
  parseJSON (Object v) =
    APIDataResponse
      <$> v .:? "data"
      <*> v .:? "sponsor"
      <*> v .:? "keyPage"
      <*> v .:? "mdRoot"
      <*> v .:? "type"

instance ToJSON Data where
  toJSON (Data txCountData urlData balanceData keyBookURLData tokenURLData creditBalanceData nonceData) =
    object
      [ "txCount" .= txCountData,
        "url" .= urlData,
        "balance" .= balanceData,
        "keyBookUrl" .= keyBookURLData,
        "tokenUrl" .= tokenURLData,
        "creditBalance" .= creditBalanceData,
        "nonce" .= nonceData
      ]

instance FromJSON Data where
  parseJSON (Object v) =
    Data
      <$> v .:? "txCount"
      <*> v .:? "url"
      <*> v .:? "balance"
      <*> v .:? "keyBookUrl"
      <*> v .:? "tokenUrl"
      <*> v .:? "creditBalance"
      <*> v .:? "nonce"