Skip to main content

rustrade_data/subscription/
trade.rs

1use super::SubscriptionKind;
2use rustrade_instrument::Side;
3use rustrade_macro::{DeSubKind, SerSubKind};
4use serde::{Deserialize, Serialize};
5use smol_str::SmolStr;
6
7/// Barter [`Subscription`](super::Subscription) [`SubscriptionKind`] that yields [`PublicTrade`]
8/// [`MarketEvent<T>`](crate::event::MarketEvent) events.
9#[derive(
10    Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, DeSubKind, SerSubKind,
11)]
12pub struct PublicTrades;
13
14impl SubscriptionKind for PublicTrades {
15    type Event = PublicTrade;
16
17    fn as_str(&self) -> &'static str {
18        "public_trades"
19    }
20}
21
22impl std::fmt::Display for PublicTrades {
23    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24        write!(f, "{}", self.as_str())
25    }
26}
27
28/// Normalised Barter [`PublicTrade`] model.
29///
30/// Uses [`SmolStr`] for `id` to avoid heap allocation for typical trade IDs
31/// (up to 23 bytes on 64-bit systems are stored inline). Exceptions that
32/// heap-allocate: Bitmex UUIDs (36 bytes), Kraken composite IDs (~34 bytes).
33#[derive(Clone, PartialEq, PartialOrd, Debug, Deserialize, Serialize)]
34pub struct PublicTrade {
35    pub id: SmolStr,
36    pub price: f64,
37    pub amount: f64,
38    pub side: Side,
39}