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::{error::SocketError, protocol::websocket::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/// [`Kraken`] exchange.
47///
48/// See docs: <https://docs.kraken.com/websockets/#overview>
49#[derive(
50    Copy,
51    Clone,
52    Eq,
53    PartialEq,
54    Ord,
55    PartialOrd,
56    Hash,
57    Debug,
58    Default,
59    Display,
60    DeExchange,
61    SerExchange,
62)]
63pub struct Kraken;
64
65impl Connector for Kraken {
66    const ID: ExchangeId = ExchangeId::Kraken;
67    type Channel = KrakenChannel;
68    type Market = KrakenMarket;
69    type Subscriber = WebSocketSubscriber;
70    type SubValidator = WebSocketSubValidator;
71    type SubResponse = KrakenSubResponse;
72
73    fn url() -> Result<Url, SocketError> {
74        Url::parse(BASE_URL_KRAKEN).map_err(SocketError::UrlParse)
75    }
76
77    fn requests(exchange_subs: Vec<ExchangeSub<Self::Channel, Self::Market>>) -> Vec<WsMessage> {
78        exchange_subs
79            .into_iter()
80            .map(|ExchangeSub { channel, market }| {
81                WsMessage::text(
82                    json!({
83                        "event": "subscribe",
84                        "pair": [market.as_ref()],
85                        "subscription": {
86                            "name": channel.as_ref()
87                        }
88                    })
89                    .to_string(),
90                )
91            })
92            .collect()
93    }
94}
95
96impl<Instrument> StreamSelector<Instrument, PublicTrades> for Kraken
97where
98    Instrument: InstrumentData,
99{
100    type SnapFetcher = NoInitialSnapshots;
101    type Stream =
102        ExchangeWsStream<StatelessTransformer<Self, Instrument::Key, PublicTrades, KrakenTrades>>;
103}
104
105impl<Instrument> StreamSelector<Instrument, OrderBooksL1> for Kraken
106where
107    Instrument: InstrumentData,
108{
109    type SnapFetcher = NoInitialSnapshots;
110    type Stream = ExchangeWsStream<
111        StatelessTransformer<Self, Instrument::Key, OrderBooksL1, KrakenOrderBookL1>,
112    >;
113}