module Coinbase.Exchange.Types.Socket where
import Control.DeepSeq
import Data.Aeson.Types
import Data.Data
import Data.Hashable
import Data.Text (Text)
import Data.Time
import Data.Word
import GHC.Generics
import Coinbase.Exchange.Types.Core
newtype Sequence = Sequence { unSequence :: Word64 }
deriving (Eq, Ord, Num, Show, Read, Data, Typeable, Generic, NFData, Hashable, FromJSON, ToJSON)
data ExchangeMessage
= Subscribe
{ msgProductId :: ProductId
}
| Received
{ msgTime :: UTCTime
, msgProductId :: ProductId
, msgSequence :: Sequence
, msgOrderId :: OrderId
, msgSize :: Size
, msgPrice :: Price
, msgSide :: Side
, msgClientOid :: Maybe ClientOrderId
}
| Open
{ msgTime :: UTCTime
, msgProductId :: ProductId
, msgSequence :: Sequence
, msgOrderId :: OrderId
, msgPrice :: Price
, msgRemainingSize :: Size
, msgSide :: Side
}
| Done
{ msgTime :: UTCTime
, msgProductId :: ProductId
, msgSequence :: Sequence
, msgPrice :: Price
, msgOrderId :: OrderId
, msgReason :: Reason
, msgSide :: Side
}
| Match
{ msgTradeId :: TradeId
, msgSequence :: Sequence
, msgMakerOrderId :: OrderId
, msgTakerOrderId :: OrderId
, msgTime :: UTCTime
, msgProductId :: ProductId
, msgSize :: Size
, msgPrice :: Price
, msgSide :: Side
}
| Change
{ msgTime :: UTCTime
, msgSequence :: Sequence
, msgOrderId :: OrderId
, msgProductId :: ProductId
, msgNewSize :: Size
, msgOldSize :: Size
, msgPrice :: Price
, msgSide :: Side
}
| Error
{ msgMessage :: Text
}
deriving (Eq, Show, Read, Data, Typeable, Generic)
instance NFData ExchangeMessage
instance ToJSON ExchangeMessage where
toJSON = genericToJSON coinbaseAesonOptions
instance FromJSON ExchangeMessage where
parseJSON = genericParseJSON coinbaseAesonOptions