use crate::types::*;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Event {
Quote(QuoteEvent),
FundingRate(FundingRateEvent),
OrderAccepted(OrderAcceptedEvent),
OrderRejected(OrderRejectedEvent),
OrderFilled(OrderFilledEvent),
OrderCompleted(OrderCompletedEvent),
OrderCanceled(OrderCanceledEvent),
ExchangeStateChanged(ExchangeStateChangedEvent),
}
impl Event {
pub fn ts(&self) -> i64 {
match self {
Event::Quote(e) => e.ts,
Event::FundingRate(e) => e.ts,
Event::OrderAccepted(e) => e.ts,
Event::OrderRejected(e) => e.ts,
Event::OrderFilled(e) => e.ts,
Event::OrderCompleted(e) => e.ts,
Event::OrderCanceled(e) => e.ts,
Event::ExchangeStateChanged(e) => e.ts,
}
}
pub fn instrument(&self) -> Option<&InstrumentId> {
match self {
Event::Quote(e) => Some(&e.instrument),
Event::FundingRate(e) => Some(&e.instrument),
Event::OrderAccepted(e) => Some(&e.instrument),
Event::OrderRejected(e) => Some(&e.instrument),
Event::OrderFilled(e) => Some(&e.instrument),
Event::OrderCompleted(e) => Some(&e.instrument),
Event::OrderCanceled(e) => Some(&e.instrument),
Event::ExchangeStateChanged(_) => None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuoteEvent {
pub exchange: ExchangeId,
pub instrument: InstrumentId,
pub bid: Price,
pub ask: Price,
pub ts: i64,
}
impl QuoteEvent {
pub fn mid(&self) -> Price {
Price((self.bid.0 + self.ask.0) / Decimal::TWO)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FundingRateEvent {
pub exchange: ExchangeId,
pub instrument: InstrumentId,
pub rate: Decimal,
pub ts: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrderAcceptedEvent {
pub exchange: ExchangeId,
pub instrument: InstrumentId,
pub client_id: ClientOrderId,
pub exchange_order_id: Option<ExchangeOrderId>,
pub ts: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrderRejectedEvent {
pub exchange: ExchangeId,
pub instrument: InstrumentId,
pub client_id: ClientOrderId,
pub reason: String,
pub ts: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrderFilledEvent {
pub exchange: ExchangeId,
pub instrument: InstrumentId,
pub client_id: ClientOrderId,
pub trade_id: TradeId,
pub side: OrderSide,
pub price: Price,
pub qty: Qty,
pub net_qty: Qty,
pub fee: Fee,
pub ts: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrderCompletedEvent {
pub exchange: ExchangeId,
pub instrument: InstrumentId,
pub client_id: ClientOrderId,
pub filled_qty: Qty,
pub avg_fill_px: Option<Price>,
pub ts: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrderCanceledEvent {
pub exchange: ExchangeId,
pub instrument: InstrumentId,
pub client_id: ClientOrderId,
pub reason: Option<String>,
pub ts: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExchangeStateChangedEvent {
pub exchange: ExchangeId,
pub old_state: ExchangeHealth,
pub new_state: ExchangeHealth,
pub reason: String,
pub ts: i64,
}