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::protocol::websocket::{WebSocketSerdeParser, 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
46pub type KrakenWsStream<Transformer> = ExchangeWsStream<WebSocketSerdeParser, Transformer>;
48
49#[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}