use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[cfg_attr(feature = "python", pyo3::prelude::pyclass)]
#[cfg_attr(feature = "js", napi_derive::napi(object))]
pub struct ResponseMeta {
pub date: String,
#[serde(rename = "type")]
pub data_type: Option<String>,
pub exchange: Option<String>,
pub market: Option<String>,
pub symbol: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[cfg_attr(feature = "python", pyo3::prelude::pyclass)]
#[cfg_attr(feature = "js", napi_derive::napi(object))]
pub struct PriceLevel {
pub price: f64,
pub size: i64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[cfg_attr(feature = "python", pyo3::prelude::pyclass)]
#[cfg_attr(feature = "js", napi_derive::napi(object))]
pub struct TradeInfo {
pub bid: Option<f64>,
pub ask: Option<f64>,
pub price: f64,
pub size: i64,
pub time: i64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[cfg_attr(feature = "python", pyo3::prelude::pyclass)]
#[cfg_attr(feature = "js", napi_derive::napi(object))]
pub struct TotalStats {
#[serde(rename = "tradeValue", default)]
pub trade_value: f64,
#[serde(rename = "tradeVolume", default)]
pub trade_volume: i64,
#[serde(rename = "tradeVolumeAtBid")]
pub trade_volume_at_bid: Option<i64>,
#[serde(rename = "tradeVolumeAtAsk")]
pub trade_volume_at_ask: Option<i64>,
pub transaction: Option<i64>,
pub time: Option<i64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[cfg_attr(feature = "python", pyo3::prelude::pyclass)]
#[cfg_attr(feature = "js", napi_derive::napi(object))]
pub struct TradingHalt {
#[serde(rename = "isHalted")]
pub is_halted: bool,
pub time: Option<i64>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_price_level_deserialization() {
let json = r#"{"price": 100.5, "size": 1000}"#;
let level: PriceLevel = serde_json::from_str(json).unwrap();
assert_eq!(level.price, 100.5);
assert_eq!(level.size, 1000);
}
#[test]
fn test_trade_info_deserialization() {
let json = r#"{"bid": 100.0, "ask": 100.5, "price": 100.5, "size": 500, "time": 1704067200000}"#;
let info: TradeInfo = serde_json::from_str(json).unwrap();
assert_eq!(info.price, 100.5);
assert_eq!(info.size, 500);
assert_eq!(info.time, 1704067200000);
}
#[test]
fn test_response_meta_deserialization() {
let json = r#"{
"date": "2024-01-15",
"type": "EQUITY",
"exchange": "TWSE",
"market": "TSE",
"symbol": "2330"
}"#;
let meta: ResponseMeta = serde_json::from_str(json).unwrap();
assert_eq!(meta.date, "2024-01-15");
assert_eq!(meta.symbol, "2330");
assert_eq!(meta.data_type.as_deref(), Some("EQUITY"));
}
}