Skip to main content

barter_data/exchange/kraken/
mod.rs

1use self::{
2    book::l1::KrakenOrderBookL1, channel::KrakenChannel, market::KrakenMarket,
3    message::KrakenMessage, subscription::KrakenSubResponse, trade::KrakenTrades,
4};
5use crate::{
6    ExchangeWsStream, NoInitialSnapshots,
7    exchange::{Connector, ExchangeSub, StreamSelector},
8    instrument::InstrumentData,
9    subscriber::{WebSocketSubscriber, validator::WebSocketSubValidator},
10    subscription::{book::OrderBooksL1, trade::PublicTrades},
11    transformer::stateless::StatelessTransformer,
12};
13use barter_instrument::exchange::ExchangeId;
14use barter_integration::protocol::websocket::{WebSocketSerdeParser, WsMessage};
15use barter_macro::{DeExchange, SerExchange};
16use derive_more::Display;
17use serde_json::json;
18use url::Url;
19
20/// OrderBook types for [`Kraken`].
21pub mod book;
22
23/// Defines the type that translates a Barter [`Subscription`](crate::subscription::Subscription)
24/// into an exchange [`Connector`] specific channel used for generating [`Connector::requests`].
25pub mod channel;
26
27/// Defines the type that translates a Barter [`Subscription`](crate::subscription::Subscription)
28/// into an exchange [`Connector`]  specific market used for generating [`Connector::requests`].
29pub mod market;
30
31/// [`KrakenMessage`] type for [`Kraken`].
32pub mod message;
33
34/// [`Subscription`](crate::subscription::Subscription) response type and response
35/// [`Validator`](barter_integration) for [`Kraken`].
36pub mod subscription;
37
38/// Public trade types for [`Kraken`].
39pub mod trade;
40
41/// [`Kraken`] server base url.
42///
43/// See docs: <https://docs.kraken.com/websockets/#overview>
44pub const BASE_URL_KRAKEN: &str = "wss://ws.kraken.com/";
45
46/// Convenient type alias for a Kraken [`ExchangeWsStream`] using [`WebSocketSerdeParser`](barter_integration::protocol::websocket::WebSocketSerdeParser).
47pub type KrakenWsStream<Transformer> = ExchangeWsStream<WebSocketSerdeParser, Transformer>;
48
49/// [`Kraken`] exchange.
50///
51/// See docs: <https://docs.kraken.com/websockets/#overview>
52#[derive(
53    Copy,
54    Clone,
55    Eq,
56    PartialEq,
57    Ord,
58    PartialOrd,
59    Hash,
60    Debug,
61    Default,
62    Display,
63    DeExchange,
64    SerExchange,
65)]
66pub struct Kraken;
67
68impl Connector for Kraken {
69    const ID: ExchangeId = ExchangeId::Kraken;
70    type Channel = KrakenChannel;
71    type Market = KrakenMarket;
72    type Subscriber = WebSocketSubscriber;
73    type SubValidator = WebSocketSubValidator;
74    type SubResponse = KrakenSubResponse;
75
76    fn url() -> Result<Url, url::ParseError> {
77        Url::parse(BASE_URL_KRAKEN)
78    }
79
80    fn requests(exchange_subs: Vec<ExchangeSub<Self::Channel, Self::Market>>) -> Vec<WsMessage> {
81        exchange_subs
82            .into_iter()
83            .map(|ExchangeSub { channel, market }| {
84                WsMessage::text(
85                    json!({
86                        "event": "subscribe",
87                        "pair": [market.as_ref()],
88                        "subscription": {
89                            "name": channel.as_ref()
90                        }
91                    })
92                    .to_string(),
93                )
94            })
95            .collect()
96    }
97}
98
99impl<Instrument> StreamSelector<Instrument, PublicTrades> for Kraken
100where
101    Instrument: InstrumentData,
102{
103    type SnapFetcher = NoInitialSnapshots;
104    type Stream =
105        KrakenWsStream<StatelessTransformer<Self, Instrument::Key, PublicTrades, KrakenTrades>>;
106}
107
108impl<Instrument> StreamSelector<Instrument, OrderBooksL1> for Kraken
109where
110    Instrument: InstrumentData,
111{
112    type SnapFetcher = NoInitialSnapshots;
113    type Stream = KrakenWsStream<
114        StatelessTransformer<Self, Instrument::Key, OrderBooksL1, KrakenOrderBookL1>,
115    >;
116}