{-# 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.Status (Status (..)) import CoinbasePro.WebSocketFeed.Channel.Ticker (Ticker (..)) import CoinbasePro.WebSocketFeed.Response (Subscription) data ChannelMessage = ActivateMessage Activate | ChangeMessage Change | DoneMessage Done | HeartbeatMessage Heartbeat | StatusMessage Status | L2ChangeMessage L2.Change | L2SnapshotMessage Snapshot | L2UpdateMessage L2Update | MatchMessage Match | OpenMessage Open | ReceivedMessage Received | TickerMessage Ticker | SubscriptionMessage Subscription deriving (Int -> ChannelMessage -> ShowS [ChannelMessage] -> ShowS ChannelMessage -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [ChannelMessage] -> ShowS $cshowList :: [ChannelMessage] -> ShowS show :: ChannelMessage -> String $cshow :: ChannelMessage -> String showsPrec :: Int -> ChannelMessage -> ShowS $cshowsPrec :: Int -> ChannelMessage -> ShowS Show, ChannelMessage -> ChannelMessage -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: ChannelMessage -> ChannelMessage -> Bool $c/= :: ChannelMessage -> ChannelMessage -> Bool == :: ChannelMessage -> ChannelMessage -> Bool $c== :: ChannelMessage -> ChannelMessage -> Bool Eq) instance FromJSON ChannelMessage where parseJSON :: Value -> Parser ChannelMessage parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a withObject String "channel message" forall a b. (a -> b) -> a -> b $ \Object o -> do Value t <- Text -> Value String forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "type" case Value t of Value "activate" -> Activate -> ChannelMessage ActivateMessage forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. FromJSON a => Value -> Parser a parseJSON (Object -> Value Object Object o) Value "change" -> Change -> ChannelMessage ChangeMessage forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. FromJSON a => Value -> Parser a parseJSON (Object -> Value Object Object o) Value "done" -> Done -> ChannelMessage DoneMessage forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. FromJSON a => Value -> Parser a parseJSON (Object -> Value Object Object o) Value "heartbeat" -> Heartbeat -> ChannelMessage HeartbeatMessage forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. FromJSON a => Value -> Parser a parseJSON (Object -> Value Object Object o) Value "status" -> Status -> ChannelMessage StatusMessage forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. FromJSON a => Value -> Parser a parseJSON (Object -> Value Object Object o) Value "l2update" -> L2Update -> ChannelMessage L2UpdateMessage forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. FromJSON a => Value -> Parser a parseJSON (Object -> Value Object Object o) Value "last_match" -> Match -> ChannelMessage MatchMessage forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. FromJSON a => Value -> Parser a parseJSON (Object -> Value Object Object o) Value "match" -> Match -> ChannelMessage MatchMessage forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. FromJSON a => Value -> Parser a parseJSON (Object -> Value Object Object o) Value "open" -> Open -> ChannelMessage OpenMessage forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. FromJSON a => Value -> Parser a parseJSON (Object -> Value Object Object o) Value "received" -> Received -> ChannelMessage ReceivedMessage forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. FromJSON a => Value -> Parser a parseJSON (Object -> Value Object Object o) Value "snapshot" -> Snapshot -> ChannelMessage L2SnapshotMessage forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. FromJSON a => Value -> Parser a parseJSON (Object -> Value Object Object o) Value "subscriptions" -> Subscription -> ChannelMessage SubscriptionMessage forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. FromJSON a => Value -> Parser a parseJSON (Object -> Value Object Object o) Value "ticker" -> Ticker -> ChannelMessage TickerMessage forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. FromJSON a => Value -> Parser a parseJSON (Object -> Value Object Object o) Value _ -> forall (m :: * -> *) a. MonadFail m => String -> m a fail String "Unable to parse channel message"