use serde::{Deserialize, Serialize};
use crate::types::MarketId;
use crate::types::order::Side;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct TwapOrder {
pub market: MarketId,
pub side: Side,
pub total_size: u64,
pub slice_count: u32,
pub delay_ms: u64,
pub reduce_only: bool,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct TwapCancel {
pub twap_id: u64,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn twap_order_serializes_snake_case() {
let a = TwapOrder {
market: MarketId(4),
side: Side::Ask,
total_size: 1_000,
slice_count: 10,
delay_ms: 500,
reduce_only: true,
};
let j = serde_json::to_value(a).unwrap();
assert_eq!(j["side"], serde_json::json!("ask"));
assert_eq!(j["total_size"], serde_json::json!(1_000));
assert_eq!(j["slice_count"], serde_json::json!(10));
assert!(j.get("totalSize").is_none(), "no camelCase leak");
}
#[test]
fn twap_cancel_round_trips() {
let a = TwapCancel { twap_id: 17 };
let j = serde_json::to_string(&a).unwrap();
assert_eq!(serde_json::from_str::<TwapCancel>(&j).unwrap(), a);
}
}