use serde::Deserialize;
use crate::{NumberString, model::InstType};
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct Ticker {
pub inst_type: InstType,
pub inst_id: String,
pub last: NumberString,
#[serde(default)]
pub last_sz: NumberString,
#[serde(default)]
pub ask_px: NumberString,
#[serde(default)]
pub ask_sz: NumberString,
#[serde(default)]
pub bid_px: NumberString,
#[serde(default)]
pub bid_sz: NumberString,
#[serde(default)]
pub open24h: NumberString,
#[serde(default)]
pub high24h: NumberString,
#[serde(default)]
pub low24h: NumberString,
#[serde(default)]
pub vol24h: NumberString,
#[serde(default)]
pub vol_ccy24h: NumberString,
#[serde(default)]
pub sod_utc0: NumberString,
#[serde(default)]
pub sod_utc8: NumberString,
pub ts: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct IndexTicker {
pub inst_id: String,
#[serde(default)]
pub idx_px: NumberString,
#[serde(default)]
pub open24h: NumberString,
#[serde(default)]
pub high24h: NumberString,
#[serde(default)]
pub low24h: NumberString,
#[serde(default)]
pub sod_utc0: NumberString,
#[serde(default)]
pub sod_utc8: NumberString,
#[serde(default)]
pub ts: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct OrderBook {
pub asks: Vec<OrderBookLevel>,
pub bids: Vec<OrderBookLevel>,
pub ts: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(from = "BookLevelRaw")]
#[non_exhaustive]
pub struct OrderBookLevel {
pub price: NumberString,
pub size: NumberString,
pub deprecated: NumberString,
pub order_count: NumberString,
}
type BookLevelRaw = (NumberString, NumberString, NumberString, NumberString);
impl From<BookLevelRaw> for OrderBookLevel {
fn from(raw: BookLevelRaw) -> Self {
Self {
price: raw.0,
size: raw.1,
deprecated: raw.2,
order_count: raw.3,
}
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(from = "CandleRaw")]
#[non_exhaustive]
pub struct Candle {
pub ts: NumberString,
pub open: NumberString,
pub high: NumberString,
pub low: NumberString,
pub close: NumberString,
pub vol: NumberString,
pub vol_ccy: NumberString,
pub vol_ccy_quote: NumberString,
pub confirm: NumberString,
}
type CandleRaw = (
NumberString,
NumberString,
NumberString,
NumberString,
NumberString,
NumberString,
NumberString,
NumberString,
NumberString,
);
impl From<CandleRaw> for Candle {
fn from(raw: CandleRaw) -> Self {
Self {
ts: raw.0,
open: raw.1,
high: raw.2,
low: raw.3,
close: raw.4,
vol: raw.5,
vol_ccy: raw.6,
vol_ccy_quote: raw.7,
confirm: raw.8,
}
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct MarketTrade {
pub inst_id: String,
#[serde(default)]
pub trade_id: String,
#[serde(default)]
pub px: NumberString,
#[serde(default)]
pub sz: NumberString,
#[serde(default)]
pub side: String,
#[serde(default)]
pub source: String,
#[serde(default)]
pub ts: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct BlockTicker {
#[serde(default)]
pub inst_type: String,
#[serde(default)]
pub inst_id: String,
#[serde(default)]
pub last: NumberString,
#[serde(default)]
pub last_sz: NumberString,
#[serde(default)]
pub ask_px: NumberString,
#[serde(default)]
pub ask_sz: NumberString,
#[serde(default)]
pub bid_px: NumberString,
#[serde(default)]
pub bid_sz: NumberString,
#[serde(default)]
pub open24h: NumberString,
#[serde(default)]
pub high24h: NumberString,
#[serde(default)]
pub low24h: NumberString,
#[serde(default)]
pub vol24h: NumberString,
#[serde(default)]
pub vol_ccy24h: NumberString,
#[serde(default)]
pub sod_utc0: NumberString,
#[serde(default)]
pub sod_utc8: NumberString,
#[serde(default)]
pub ts: NumberString,
}
pub type BlockTrade = MarketTrade;
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct OptionInstrumentFamilyTrade {
#[serde(default)]
pub inst_id: String,
#[serde(default)]
pub inst_family: String,
#[serde(default)]
pub trade_id: String,
#[serde(default)]
pub px: NumberString,
#[serde(default)]
pub sz: NumberString,
#[serde(default)]
pub side: String,
#[serde(default)]
pub ts: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct PlatformVolume {
#[serde(default)]
pub vol_usd: NumberString,
#[serde(default)]
pub vol_cny: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct IndexComponents {
#[serde(default)]
pub index: String,
#[serde(default)]
pub components: Vec<IndexComponent>,
#[serde(default)]
pub ts: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct IndexComponent {
#[serde(default)]
pub exch: String,
#[serde(default)]
pub symbol: String,
#[serde(default)]
pub sym_px: NumberString,
#[serde(default)]
pub wgt: NumberString,
#[serde(default)]
pub cnv_px: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct ExchangeRate {
#[serde(default)]
pub usd_cny: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(from = "IndexCandleRaw")]
#[non_exhaustive]
pub struct IndexCandle {
pub ts: NumberString,
pub open: NumberString,
pub high: NumberString,
pub low: NumberString,
pub close: NumberString,
pub confirm: NumberString,
}
type IndexCandleRaw = (
NumberString,
NumberString,
NumberString,
NumberString,
NumberString,
NumberString,
);
impl From<IndexCandleRaw> for IndexCandle {
fn from(raw: IndexCandleRaw) -> Self {
Self {
ts: raw.0,
open: raw.1,
high: raw.2,
low: raw.3,
close: raw.4,
confirm: raw.5,
}
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct OptionFamilyTradeGroup {
#[serde(default)]
pub vol24h: NumberString,
#[serde(default)]
pub opt_type: String,
#[serde(default)]
pub trade_info: Vec<OptionInstrumentFamilyTrade>,
}