use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrderbookLevel {
pub price: String,
pub size: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BookSnapshot {
pub asset_id: String,
pub market: String,
#[serde(default)]
pub event_title: Option<String>,
#[serde(default)]
pub question: Option<String>,
#[serde(default)]
pub outcome: Option<String>,
#[serde(default)]
pub slug: Option<String>,
pub bids: Vec<OrderbookLevel>,
pub asks: Vec<OrderbookLevel>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BookUpdate {
pub asset_id: String,
pub market: String,
#[serde(default)]
pub event_title: Option<String>,
#[serde(default)]
pub question: Option<String>,
#[serde(default)]
pub outcome: Option<String>,
#[serde(default)]
pub slug: Option<String>,
pub bids: Vec<OrderbookLevel>,
pub asks: Vec<OrderbookLevel>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct PriceChangeAsset {
pub asset_id: String,
pub price: String,
#[serde(default)]
pub outcome: String,
#[serde(default)]
pub size: Option<String>,
#[serde(default)]
pub side: Option<String>,
#[serde(default)]
pub best_bid: Option<String>,
#[serde(default)]
pub best_ask: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct PriceChange {
pub market: String,
#[serde(default)]
pub event_title: Option<String>,
#[serde(default)]
pub question: Option<String>,
#[serde(default)]
pub slug: Option<String>,
pub assets: Vec<PriceChangeAsset>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BookTrade {
pub asset_id: String,
pub market: String,
pub price: String,
pub size: String,
pub side: String,
pub fee_rate_bps: String,
pub timestamp: String,
#[serde(default)]
pub outcome: Option<String>,
#[serde(default)]
pub slug: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(tag = "type")]
pub enum OrderbookUpdate {
#[serde(rename = "book_snapshot")]
Snapshot(BookSnapshot),
#[serde(rename = "book_update")]
Update(BookUpdate),
#[serde(rename = "price_change")]
PriceChange(PriceChange),
#[serde(rename = "last_trade_price")]
LastTradePrice(BookTrade),
}
#[derive(Debug)]
pub enum ObMessage {
Update(OrderbookUpdate),
SnapshotsDone { total: u64 },
Subscribed { markets: u64 },
Unsubscribed,
Error { error: String, message: String },
}
#[derive(Debug, Deserialize)]
pub(crate) struct RawObMessage {
#[serde(rename = "type", default)]
pub msg_type: Option<String>,
#[serde(default)]
pub error: Option<String>,
#[serde(default)]
pub message: Option<String>,
#[serde(default)]
pub markets: Option<u64>,
#[serde(default)]
pub total: Option<u64>,
#[serde(default)]
pub snapshots: Option<Vec<serde_json::Value>>,
#[serde(default)]
pub updates: Option<Vec<serde_json::Value>>,
}