use super::SubscriptionKind;
use crate::books::{Level, OrderBook, mid_price, volume_weighted_mid_price};
use barter_macro::{DeSubKind, SerSubKind};
use chrono::{DateTime, Utc};
use derive_more::Constructor;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
#[derive(
Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, DeSubKind, SerSubKind,
)]
pub struct OrderBooksL1;
impl SubscriptionKind for OrderBooksL1 {
type Event = OrderBookL1;
fn as_str(&self) -> &'static str {
"l1"
}
}
impl std::fmt::Display for OrderBooksL1 {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(
Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Default, Deserialize, Serialize, Constructor,
)]
pub struct OrderBookL1 {
pub last_update_time: DateTime<Utc>,
pub best_bid: Option<Level>,
pub best_ask: Option<Level>,
}
impl OrderBookL1 {
pub fn mid_price(&self) -> Option<Decimal> {
match (self.best_ask, self.best_bid) {
(Some(best_ask), Some(best_bid)) => Some(mid_price(best_bid.price, best_ask.price)),
_ => None,
}
}
pub fn volume_weighed_mid_price(&self) -> Option<Decimal> {
match (self.best_ask, self.best_bid) {
(Some(best_ask), Some(best_bid)) => Some(volume_weighted_mid_price(best_bid, best_ask)),
_ => None,
}
}
}
#[derive(
Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, DeSubKind, SerSubKind,
)]
pub struct OrderBooksL2;
impl SubscriptionKind for OrderBooksL2 {
type Event = OrderBookEvent;
fn as_str(&self) -> &'static str {
"l2"
}
}
impl std::fmt::Display for OrderBooksL2 {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(
Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, DeSubKind, SerSubKind,
)]
pub struct OrderBooksL3;
impl SubscriptionKind for OrderBooksL3 {
type Event = OrderBookEvent;
fn as_str(&self) -> &'static str {
"l3"
}
}
impl std::fmt::Display for OrderBooksL3 {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
pub enum OrderBookEvent {
Snapshot(OrderBook),
Update(OrderBook),
}