coinbase-pro-0.5.0.0: src/lib/CoinbasePro/WebSocketFeed/Channel.hs
{-# LANGUAGE OverloadedStrings #-}
module CoinbasePro.WebSocketFeed.Channel
( ChannelMessage (..)
) where
import Data.Aeson (FromJSON (..),
Value (..),
withObject,
(.:))
import CoinbasePro.WebSocketFeed.Channel.Full.Activate (Activate (..))
import CoinbasePro.WebSocketFeed.Channel.Full.Change (Change (..))
import CoinbasePro.WebSocketFeed.Channel.Full.Done (Done (..))
import CoinbasePro.WebSocketFeed.Channel.Full.Match (Match (..))
import CoinbasePro.WebSocketFeed.Channel.Full.Open (Open (..))
import CoinbasePro.WebSocketFeed.Channel.Full.Received (Received (..))
import CoinbasePro.WebSocketFeed.Channel.Heartbeat (Heartbeat (..))
import CoinbasePro.WebSocketFeed.Channel.Level2 (L2Update (..),
Snapshot (..))
import qualified CoinbasePro.WebSocketFeed.Channel.Level2 as L2
import CoinbasePro.WebSocketFeed.Channel.Ticker (Ticker (..))
import CoinbasePro.WebSocketFeed.Response (Subscription)
data ChannelMessage =
ActivateMessage Activate
| ChangeMessage Change
| DoneMessage Done
| HeartbeatMessage Heartbeat
| L2ChangeMessage L2.Change
| L2SnapshotMessage Snapshot
| L2UpdateMessage L2Update
| MatchMessage Match
| OpenMessage Open
| ReceivedMessage Received
| TickerMessage Ticker
| SubscriptionMessage Subscription
deriving (Show, Eq)
instance FromJSON ChannelMessage where
parseJSON = withObject "channel message" $ \o -> do
t <- String <$> o .: "type"
case t of
"activate" -> ActivateMessage <$> parseJSON (Object o)
"change" -> ChangeMessage <$> parseJSON (Object o)
"done" -> DoneMessage <$> parseJSON (Object o)
"heartbeat" -> HeartbeatMessage <$> parseJSON (Object o)
"l2update" -> L2UpdateMessage <$> parseJSON (Object o)
"last_match" -> MatchMessage <$> parseJSON (Object o)
"match" -> MatchMessage <$> parseJSON (Object o)
"open" -> OpenMessage <$> parseJSON (Object o)
"received" -> ReceivedMessage <$> parseJSON (Object o)
"snapshot" -> L2SnapshotMessage <$> parseJSON (Object o)
"subscriptions" -> SubscriptionMessage <$> parseJSON (Object o)
"ticker" -> TickerMessage <$> parseJSON (Object o)
_ -> fail "Unable to parse channel message"