packages feed

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

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

module Accumulate.RPC.Types.ApiDataMetricsResponse
    ( APIDataMetricsResponse (..)
    , Data (..)
    , decodeTopLevel
    ) where

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

data APIDataMetricsResponse = APIDataMetricsResponse
    { apiDataMetricsResponseDataAPIDataMetricsResponse :: Data
    , sponsorAPIDataMetricsResponse :: Text
    , keyPageAPIDataMetricsResponse :: Maybe Text
    , apiDataMetricsResponseTypeAPIDataMetricsResponse :: Text
    } deriving (Show)

data Data = Data
    { valueData :: Text
    } deriving (Show)

decodeTopLevel :: ByteString -> Maybe APIDataMetricsResponse
decodeTopLevel = decode

instance ToJSON APIDataMetricsResponse where
    toJSON (APIDataMetricsResponse apiDataMetricsResponseDataAPIDataMetricsResponse sponsorAPIDataMetricsResponse keyPageAPIDataMetricsResponse apiDataMetricsResponseTypeAPIDataMetricsResponse) =
        object
        [ "data" .= apiDataMetricsResponseDataAPIDataMetricsResponse
        , "sponsor" .= sponsorAPIDataMetricsResponse
        , "keyPage" .= keyPageAPIDataMetricsResponse
        , "type" .= apiDataMetricsResponseTypeAPIDataMetricsResponse
        ]

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

instance ToJSON Data where
    toJSON (Data valueData) =
        object
        [ "value" .= valueData
        ]

instance FromJSON Data where
    parseJSON (Object v) = Data
        <$> v .: "value"