use rust_decimal::Decimal;
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct ExecutionsMessage {
pub channel: String,
#[serde(rename = "type")]
pub msg_type: String,
pub data: Vec<ExecutionData>,
#[serde(default)]
pub sequence: Option<u64>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ExecutionData {
#[serde(default)]
pub exec_id: Option<String>,
pub order_id: String,
#[serde(default)]
pub cl_ord_id: Option<String>,
pub symbol: String,
pub side: String,
pub order_type: String,
pub order_status: String,
#[serde(default)]
pub limit_price: Option<Decimal>,
#[serde(default)]
pub order_qty: Option<Decimal>,
#[serde(default)]
pub filled_qty: Option<Decimal>,
#[serde(default)]
pub leaves_qty: Option<Decimal>,
#[serde(default)]
pub cum_cost: Option<Decimal>,
#[serde(default)]
pub cum_fee: Option<Decimal>,
#[serde(default)]
pub avg_price: Option<Decimal>,
#[serde(default)]
pub fee_ccy: Option<String>,
#[serde(default)]
pub fee_preference: Option<String>,
#[serde(default)]
pub time_in_force: Option<String>,
#[serde(default)]
pub exec_type: Option<String>,
#[serde(default)]
pub last_qty: Option<Decimal>,
#[serde(default)]
pub last_price: Option<Decimal>,
#[serde(default)]
pub liquidity_ind: Option<String>,
#[serde(default)]
pub trade_id: Option<i64>,
#[serde(default)]
pub post_only: Option<bool>,
#[serde(default)]
pub reduce_only: Option<bool>,
#[serde(default)]
pub timestamp: Option<String>,
}
impl ExecutionData {
pub fn is_fill(&self) -> bool {
self.exec_type.as_deref() == Some("trade")
}
pub fn is_filled(&self) -> bool {
self.order_status == "filled"
}
pub fn is_cancelled(&self) -> bool {
self.order_status == "canceled"
}
pub fn is_open(&self) -> bool {
self.order_status == "open" || self.order_status == "new"
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct BalancesMessage {
pub channel: String,
#[serde(rename = "type")]
pub msg_type: String,
pub data: Vec<BalanceData>,
#[serde(default)]
pub sequence: Option<u64>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BalanceData {
pub asset: String,
pub balance: Decimal,
#[serde(default)]
pub hold_trade: Option<Decimal>,
}
impl BalanceData {
pub fn total(&self) -> Decimal {
self.balance + self.hold_trade.unwrap_or_default()
}
pub fn available(&self) -> Decimal {
self.balance
}
pub fn on_hold(&self) -> Decimal {
self.hold_trade.unwrap_or_default()
}
}