barter_data/exchange/kraken/
mod.rs1use 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
20pub mod book;
22
23pub mod channel;
26
27pub mod market;
30
31pub mod message;
33
34pub mod subscription;
37
38pub mod trade;
40
41pub const BASE_URL_KRAKEN: &str = "wss://ws.kraken.com/";
45
46#[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}