1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
use crate::{subscription::Subscription, Identifier};
use barter_integration::model::SubscriptionId;
use serde::Deserialize;
/// Defines an exchange specific market and channel combination used by an exchange
/// [`Connector`](super::Connector) to build the
/// [`WsMessage`](barter_integration::protocol::websocket::WsMessage) subscription payloads to
/// send to the exchange server.
///
/// ### Examples
/// #### Binance OrderBooksL2
/// ```json
/// ExchangeSub {
/// channel: BinanceChannel("@depth@100ms"),
/// market: BinanceMarket("btcusdt"),
/// }
/// ```
/// #### Kraken PublicTrades
/// ```json
/// ExchangeSub {
/// channel: KrakenChannel("trade"),
/// market: KrakenChannel("BTC/USDT")
/// }
/// ```
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Deserialize)]
pub struct ExchangeSub<Channel, Market> {
/// Type that defines how to translate a Barter [`Subscription`] into an exchange specific
/// channel to be subscribed to.
///
/// ### Examples
/// - [`BinanceChannel("@depth@100ms")`](super::binance::channel::BinanceChannel)
/// - [`KrakenChannel("trade")`](super::kraken::channel::KrakenChannel)
pub channel: Channel,
/// Type that defines how to translate a Barter [`Subscription`] into an exchange specific
/// market that can be subscribed to.
///
/// ### Examples
/// - [`BinanceMarket("btcusdt")`](super::binance::market::BinanceMarket)
/// - [`KrakenMarket("BTC/USDT")`](super::kraken::market::KrakenMarket)
pub market: Market,
}
impl<Channel, Market> Identifier<SubscriptionId> for ExchangeSub<Channel, Market>
where
Channel: AsRef<str>,
Market: AsRef<str>,
{
fn id(&self) -> SubscriptionId {
SubscriptionId::from(format!(
"{}|{}",
self.channel.as_ref(),
self.market.as_ref()
))
}
}
impl<Channel, Market> ExchangeSub<Channel, Market>
where
Channel: AsRef<str>,
Market: AsRef<str>,
{
/// Construct a new exchange specific [`Self`] with the Barter [`Subscription`] provided.
pub fn new<Exchange, Kind>(sub: &Subscription<Exchange, Kind>) -> Self
where
Subscription<Exchange, Kind>: Identifier<Channel> + Identifier<Market>,
{
Self {
channel: sub.id(),
market: sub.id(),
}
}
}
impl<Channel, Market> From<(Channel, Market)> for ExchangeSub<Channel, Market>
where
Channel: AsRef<str>,
Market: AsRef<str>,
{
fn from((channel, market): (Channel, Market)) -> Self {
Self { channel, market }
}
}