use serde::Deserialize;
use rust_decimal::Decimal;
use crate::clob::OrderSide;
#[derive(Debug, Clone, Deserialize)]
pub struct OrderSummary {
#[serde(with = "rust_decimal::serde::str")]
pub price: Decimal,
#[serde(with = "rust_decimal::serde::str")]
pub size: Decimal,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct BookMessage {
pub market: String,
pub asset_id: String,
pub timestamp: String,
pub bids: Vec<OrderSummary>,
pub asks: Vec<OrderSummary>,
pub hash: String,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct PriceChange {
pub asset_id: String,
#[serde(with = "rust_decimal::serde::str")]
pub price: Decimal,
#[serde(with = "rust_decimal::serde::str")]
pub size: Decimal,
pub side: OrderSide,
pub hash: String,
#[serde(with = "rust_decimal::serde::str")]
pub best_bid: Decimal,
#[serde(with = "rust_decimal::serde::str")]
pub best_ask: Decimal,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct PriceChangeMessage {
pub market: String,
pub timestamp: String,
pub price_changes: Vec<PriceChange>,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct TickSizeChangeMessage {
pub market: String,
pub asset_id: String,
pub timestamp: String,
#[serde(with = "rust_decimal::serde::str")]
pub old_tick_size: Decimal,
#[serde(with = "rust_decimal::serde::str")]
pub new_tick_size: Decimal,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct LastTradePriceMessage {
pub market: String,
pub asset_id: String,
pub timestamp: String,
pub side: OrderSide,
#[serde(with = "rust_decimal::serde::str")]
pub price: Decimal,
#[serde(with = "rust_decimal::serde::str")]
pub size: Decimal,
#[serde(with = "rust_decimal::serde::str")]
pub fee_rate_bps: Decimal,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct MakerOrder {
pub asset_id: String,
pub order_id: String,
pub owner: String,
#[serde(with = "rust_decimal::serde::str")]
pub matched_amount: Decimal,
pub outcome: String,
#[serde(with = "rust_decimal::serde::str")]
pub price: Decimal,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub enum TradeStatus {
MATCHED,
MINED,
CONFIRMED,
RETRYING,
FAILED,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub enum TradeType {
TRADE,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct TradeMessage {
pub id: String,
pub market: String,
pub asset_id: String,
pub owner: String,
pub timestamp: String,
pub last_update: String,
pub maker_orders: Vec<MakerOrder>,
pub match_time: String,
pub outcome: String,
#[serde(with = "rust_decimal::serde::str")]
pub price: Decimal,
#[serde(with = "rust_decimal::serde::str")]
pub size: Decimal,
pub side: OrderSide,
pub status: TradeStatus,
pub taker_order_id: String,
pub trade_owner: String,
pub r#type: TradeType,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub enum OrderType {
PLACEMENT,
UPDATE,
CANCELLATION,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct OrderMessage {
pub id: String,
pub market: String,
pub asset_id: String,
pub timestamp: String,
pub associate_trades: Option<Vec<String>>,
pub order_owner: String,
#[serde(with = "rust_decimal::serde::str")]
pub original_size: Decimal,
pub outcome: String,
pub owner: String,
#[serde(with = "rust_decimal::serde::str")]
pub price: Decimal,
pub side: OrderSide,
#[serde(with = "rust_decimal::serde::str")]
pub size_matched: Decimal,
pub r#type: OrderType,
}
#[derive(Debug, Clone, serde::Deserialize)]
#[serde(tag = "event_type", rename_all = "snake_case")]
pub enum WebSocketMessage {
Trade(TradeMessage),
Order(OrderMessage),
Book(BookMessage),
PriceChange(PriceChangeMessage),
TickSizeChange(TickSizeChangeMessage),
LastTradePrice(LastTradePriceMessage),
}