diff --git a/examples/demo.rs b/examples/demo.rs index d505e81..7fb6319 100644 --- a/examples/demo.rs +++ b/examples/demo.rs @@ -660,7 +660,7 @@ impl PolyfillDemo { sequence: book.timestamp, }); } - } + }, StreamMessage::Trade(trade) => { info!( " Processing trade: {} {} @ {}", @@ -668,10 +668,10 @@ impl PolyfillDemo { trade.size, trade.price ); - } + }, _ => { info!(" Unhandled message type"); - } + }, } } diff --git a/src/client.rs b/src/client.rs index 8e41290..6e1e70c 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1942,7 +1942,10 @@ mod tests { assert_eq!(book.min_order_size, Decimal::from_str("1").unwrap()); assert!(!book.neg_risk); assert_eq!(book.tick_size, Decimal::from_str("0.01").unwrap()); - assert_eq!(book.last_trade_price, Some(Decimal::from_str("0.755").unwrap())); + assert_eq!( + book.last_trade_price, + Some(Decimal::from_str("0.755").unwrap()) + ); } #[tokio::test(flavor = "multi_thread")] diff --git a/src/decode.rs b/src/decode.rs index 18c2715..5a7285f 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -141,7 +141,7 @@ pub mod deserializers { .map(Some) .map_err(serde::de::Error::custom) } - } + }, serde_json::Value::Number(n) => Decimal::from_str(&n.to_string()) .map(Some) .map_err(serde::de::Error::custom), @@ -168,7 +168,7 @@ pub mod deserializers { } else { Ok(s.parse::().ok()) } - } + }, serde_json::Value::Number(n) => Ok(Decimal::from_str(&n.to_string()).ok()), _ => Ok(None), } @@ -457,9 +457,9 @@ pub fn parse_stream_messages_bytes(bytes: &[u8]) -> Result> { StreamMessage::Unknown => Ok(vec![]), other => Ok(vec![other]), } - } + }, } - } + }, Value::Array(arr) => Ok(arr .into_iter() .filter_map(|elem| { @@ -467,15 +467,8 @@ pub fn parse_stream_messages_bytes(bytes: &[u8]) -> Result> { let event_type = obj.get("event_type").and_then(Value::as_str)?; // Skip unknown event types early (forward compatibility). match event_type { - "book" - | "price_change" - | "tick_size_change" - | "last_trade_price" - | "best_bid_ask" - | "new_market" - | "market_resolved" - | "trade" - | "order" => {} + "book" | "price_change" | "tick_size_change" | "last_trade_price" + | "best_bid_ask" | "new_market" | "market_resolved" | "trade" | "order" => {}, _ => return None, } diff --git a/src/stream.rs b/src/stream.rs index dbca228..87192f2 100644 --- a/src/stream.rs +++ b/src/stream.rs @@ -393,22 +393,22 @@ impl Stream for WebSocketStream { self.stats.messages_received += 1; self.stats.last_message_time = Some(Utc::now()); continue; - } + }, Err(e) => { self.stats.errors += 1; return Poll::Ready(Some(Err(e))); - } + }, } - } + }, tokio_tungstenite::tungstenite::Message::Close(_) => { info!("WebSocket connection closed by server"); self.connection = None; return Poll::Ready(None); - } + }, tokio_tungstenite::tungstenite::Message::Ping(_) => { // Best-effort: tokio-tungstenite/tungstenite may handle pings internally. continue; - } + }, tokio_tungstenite::tungstenite::Message::Pong(_) => continue, tokio_tungstenite::tungstenite::Message::Binary(_) => continue, tokio_tungstenite::tungstenite::Message::Frame(_) => continue, @@ -417,11 +417,11 @@ impl Stream for WebSocketStream { error!("WebSocket error: {}", e); self.stats.errors += 1; return Poll::Ready(Some(Err(e.into()))); - } + }, Poll::Ready(None) => { info!("WebSocket stream ended"); return Poll::Ready(None); - } + }, } } } diff --git a/src/types.rs b/src/types.rs index bd6ed89..0c47a4e 100644 --- a/src/types.rs +++ b/src/types.rs @@ -735,9 +735,15 @@ pub struct BookUpdate { pub market: String, #[serde(deserialize_with = "crate::decode::deserializers::number_from_string")] pub timestamp: u64, - #[serde(default, deserialize_with = "crate::decode::deserializers::vec_from_null")] + #[serde( + default, + deserialize_with = "crate::decode::deserializers::vec_from_null" + )] pub bids: Vec, - #[serde(default, deserialize_with = "crate::decode::deserializers::vec_from_null")] + #[serde( + default, + deserialize_with = "crate::decode::deserializers::vec_from_null" + )] pub asks: Vec, #[serde(default)] pub hash: Option, @@ -749,7 +755,10 @@ pub struct PriceChange { pub market: String, #[serde(deserialize_with = "crate::decode::deserializers::number_from_string")] pub timestamp: u64, - #[serde(default, deserialize_with = "crate::decode::deserializers::vec_from_null")] + #[serde( + default, + deserialize_with = "crate::decode::deserializers::vec_from_null" + )] pub price_changes: Vec, } @@ -832,7 +841,10 @@ pub struct NewMarket { pub description: String, #[serde(rename = "assets_ids", alias = "asset_ids")] pub asset_ids: Vec, - #[serde(default, deserialize_with = "crate::decode::deserializers::vec_from_null")] + #[serde( + default, + deserialize_with = "crate::decode::deserializers::vec_from_null" + )] pub outcomes: Vec, #[serde(default)] pub event_message: Option, @@ -853,7 +865,10 @@ pub struct MarketResolved { pub description: Option, #[serde(rename = "assets_ids", alias = "asset_ids")] pub asset_ids: Vec, - #[serde(default, deserialize_with = "crate::decode::deserializers::vec_from_null")] + #[serde( + default, + deserialize_with = "crate::decode::deserializers::vec_from_null" + )] pub outcomes: Vec, pub winning_asset_id: String, pub winning_outcome: String, @@ -1240,9 +1255,15 @@ pub struct OrderBookSummary { pub hash: Option, #[serde(deserialize_with = "crate::decode::deserializers::number_from_string")] pub timestamp: u64, - #[serde(default, deserialize_with = "crate::decode::deserializers::vec_from_null")] + #[serde( + default, + deserialize_with = "crate::decode::deserializers::vec_from_null" + )] pub bids: Vec, - #[serde(default, deserialize_with = "crate::decode::deserializers::vec_from_null")] + #[serde( + default, + deserialize_with = "crate::decode::deserializers::vec_from_null" + )] pub asks: Vec, pub min_order_size: Decimal, pub neg_risk: bool,