coinbase-pro-0.9.2.0: src/lib/CoinbasePro/Authenticated/Oracle.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
module CoinbasePro.Authenticated.Oracle
( OracleResponse (..)
) where
import Data.Aeson (FromJSON, parseJSON, withObject, (.:))
import Data.Aeson.Casing (snakeCase)
import Data.Aeson.TH (defaultOptions, deriveJSON,
fieldLabelModifier, unwrapUnaryRecords)
import Data.Map.Strict (Map)
import Data.Text (Text)
import Data.Time.Clock (UTCTime)
import Data.Time.Clock.POSIX (posixSecondsToUTCTime)
import CoinbasePro.Types (CurrencyType, Price)
newtype Message = Message Text
deriving Show
deriveJSON defaultOptions
{ fieldLabelModifier = snakeCase
, unwrapUnaryRecords = True
} ''Message
newtype Signature = Signature Text
deriving Show
deriveJSON defaultOptions
{ fieldLabelModifier = snakeCase
, unwrapUnaryRecords = True
} ''Signature
data OracleResponse = OracleResponse
{ timestamp :: UTCTime
, messages :: [Message]
, signatures :: [Signature]
, prices :: Map CurrencyType Price
} deriving Show
instance FromJSON OracleResponse where
parseJSON = withObject "oracle response" $ \o -> OracleResponse
<$> (posixSecondsToUTCTime . realToFrac . read <$> o .: "timestamp")
<*> o .: "messages"
<*> o .: "signatures"
<*> o .: "prices"