use crate::orderbooks::delta::NormalizedDelta;
use serde::Deserialize;
#[derive(Deserialize, Debug, Clone)]
pub struct CoinbaseOrderbookResponse {
pub channel: String,
pub timestamp: String,
pub sequence_num: u64,
pub events: Vec<CoinbaseL2Event>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct CoinbaseL2Event {
#[serde(rename = "type")]
pub ty: String,
pub product_id: String,
pub updates: Vec<CoinbaseL2Update>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct CoinbaseL2Update {
pub side: String,
pub event_time: String,
pub price_level: String,
pub new_quantity: String,
}
impl CoinbaseOrderbookResponse {
pub fn to_normalized(&self) -> Option<NormalizedDelta> {
let event = self.events.first()?;
let mut bids = Vec::new();
let mut asks = Vec::new();
for update in &event.updates {
let pair = (update.price_level.clone(), update.new_quantity.clone());
match update.side.as_str() {
"bid" => bids.push(pair),
"offer" | "ask" => asks.push(pair),
_ => {}
}
}
Some(NormalizedDelta {
symbol: event.product_id.clone(),
bids,
asks,
update_id: self.sequence_num,
sequence: self.sequence_num,
is_snapshot: event.ty == "snapshot",
})
}
}