coinbase-pro-0.9.0.0: src/lib/CoinbasePro/Authenticated/Limits.hs
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
module CoinbasePro.Authenticated.Limits
( Limits (..)
) where
import Data.Aeson (FromJSON, ToJSON, parseJSON, withText)
import Data.Aeson.Casing (snakeCase)
import Data.Aeson.TH (defaultOptions, deriveJSON,
fieldLabelModifier)
import Data.Map.Strict (Map)
import Data.Text (Text, unpack)
import CoinbasePro.Types (ProductId)
newtype LimitCurrency = LimitCurrency Text
deriving (Eq, Show, ToJSON, FromJSON)
newtype Max = Max Double
deriving (Eq, Show, ToJSON, FromJSON)
newtype Remaining = Remaining Double
deriving (Eq, Show, ToJSON, FromJSON)
newtype PeriodInDays = PeriodInDays Int
deriving (Eq, Show, ToJSON)
instance FromJSON PeriodInDays where
parseJSON = withText "period_in_days" $ \t ->
return . PeriodInDays . read $ unpack t
data Limit = Limit
{ max :: Max
, remaining :: Remaining
, periodInDays :: Maybe PeriodInDays
} deriving (Eq, Show)
deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''Limit
type LimitMap = Map ProductId Limit
data TransferLimits = TransferLimits
{ ach :: Maybe LimitMap
, achNoBalance :: Maybe LimitMap
, creditDebitCard :: Maybe LimitMap
, achCurm :: Maybe LimitMap
, secure3dBuy :: Maybe LimitMap
, exchangeWithdraw :: Maybe LimitMap
, exchangeAch :: Maybe LimitMap
, paypalWithdrawal :: Maybe LimitMap
, instantAchWithdrawal :: Maybe LimitMap
, instantBuy :: Maybe LimitMap
, buy :: Maybe LimitMap
, sell :: Maybe LimitMap
} deriving (Eq, Show)
deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''TransferLimits
data Limits = Limits
{ limitCurrency :: LimitCurrency
, transferLimits :: TransferLimits
} deriving (Eq, Show)
deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''Limits