use rust_decimal::Decimal;
use rust_decimal::serde::float as decimal_float;
use serde::Deserialize;
use crate::error::{Error, Result};
pub mod nasdaq;
pub mod nyse;
pub mod options;
#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub struct Content {
pub key: String,
pub delayed: bool,
#[serde(default)]
pub symbol: Option<String>,
pub market_snapshot_time: u64,
pub bid_side_levels: Vec<PriceLevel>,
pub ask_side_levels: Vec<PriceLevel>,
}
#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub struct PriceLevel {
#[serde(rename = "0", with = "decimal_float")]
pub price: Decimal,
#[serde(rename = "1")]
pub aggregate_size: u64,
#[serde(rename = "2")]
pub market_maker_count: u32,
#[serde(rename = "3")]
pub market_makers: Vec<MarketMaker>,
}
#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub struct MarketMaker {
#[serde(rename = "0")]
pub market_maker_id: String,
#[serde(rename = "1")]
pub size: u64,
#[serde(rename = "2")]
pub quote_time: u64,
}
pub(crate) fn decode_batch(
remapped: serde_json::Value,
service_label: &str,
) -> Result<Vec<Content>> {
serde_json::from_value(remapped).map_err(|e| Error::Codec {
context: format!("{service_label} content"),
reason: e.to_string(),
})
}