{-# 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"