use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize)]
pub struct FuturesContractWrapper {
pub result: FuturesContract,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FuturesContract {
pub id: Option<String>,
pub symbol: Option<String>,
#[serde(rename = "displaySymbol")]
pub display_symbol: Option<String>,
pub description: Option<String>,
pub multiplier: Option<String>,
pub expiration: Option<String>,
pub tradability: Option<String>,
pub state: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct FuturesQuoteDataWrapper {
pub data: Vec<FuturesQuoteDataItem>,
}
#[derive(Debug, Deserialize)]
pub struct FuturesQuoteDataItem {
pub data: FuturesQuote,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FuturesQuote {
pub symbol: Option<String>,
pub bid_price: Option<String>,
pub bid_size: Option<i64>,
pub ask_price: Option<String>,
pub ask_size: Option<i64>,
pub last_trade_price: Option<String>,
pub last_trade_size: Option<i64>,
pub state: Option<String>,
pub updated_at: Option<String>,
pub instrument_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FuturesOrder {
pub order_id: Option<String>,
pub order_state: Option<String>,
pub quantity: Option<String>,
pub filled_quantity: Option<String>,
pub average_price: Option<String>,
pub order_legs: Option<Vec<serde_json::Value>>,
pub realized_pnl: Option<serde_json::Value>,
pub total_fee: Option<serde_json::Value>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FuturesAccount {
pub id: Option<String>,
pub account_type: Option<String>,
}
#[cfg(test)]
mod tests {
use super::{FuturesContract, FuturesQuote};
#[test]
fn contract_maps_camelcase_display_symbol() {
let json = r#"{"id":"x","symbol":"/ESM26:XCME","displaySymbol":"/ESM26","state":"active"}"#;
let c: FuturesContract = serde_json::from_str(json).unwrap();
assert_eq!(c.display_symbol.as_deref(), Some("/ESM26"));
}
#[test]
fn quote_retains_symbol() {
let json = r#"{"symbol":"/ESM26:XCME","bid_price":"1.0","ask_price":"2.0"}"#;
let q: FuturesQuote = serde_json::from_str(json).unwrap();
assert_eq!(q.symbol.as_deref(), Some("/ESM26:XCME"));
}
}