use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use strum::{Display, EnumString};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MarketOrder {
pub id: String,
pub client_id: Option<u32>,
pub symbol: String,
pub side: Side,
pub quantity: Option<Decimal>,
pub executed_quantity: Decimal,
pub quote_quantity: Option<Decimal>,
pub executed_quote_quantity: Decimal,
pub trigger_price: Option<Decimal>,
pub time_in_force: TimeInForce,
pub self_trade_prevention: SelfTradePrevention,
pub status: OrderStatus,
pub created_at: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LimitOrder {
pub id: String,
pub client_id: Option<u32>,
pub symbol: String,
pub side: Side,
pub quantity: Decimal,
pub executed_quantity: Decimal,
pub executed_quote_quantity: Decimal,
pub price: Decimal,
pub trigger_price: Option<Decimal>,
pub time_in_force: TimeInForce,
pub self_trade_prevention: SelfTradePrevention,
pub post_only: bool,
pub status: OrderStatus,
pub created_at: i64,
}
#[derive(Debug, Display, Clone, Copy, Serialize, Deserialize, Default, EnumString, PartialEq, Eq, Hash)]
#[strum(serialize_all = "PascalCase")]
#[serde(rename_all = "PascalCase")]
pub enum OrderType {
#[default]
Limit,
Market,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "orderType")]
pub enum Order {
Market(MarketOrder),
Limit(LimitOrder),
}
#[derive(Debug, Display, Clone, Copy, Serialize, Deserialize, Default, EnumString, PartialEq, Eq, Hash)]
#[strum(serialize_all = "UPPERCASE")]
#[serde(rename_all = "UPPERCASE")]
pub enum TimeInForce {
#[default]
GTC,
IOC,
FOK,
}
#[derive(Debug, Display, Clone, Copy, Serialize, Deserialize, Default, EnumString, PartialEq, Eq, Hash)]
#[strum(serialize_all = "PascalCase")]
#[serde(rename_all = "PascalCase")]
pub enum SelfTradePrevention {
#[default]
RejectTaker,
RejectMaker,
RejectBoth,
Allow,
}
#[derive(Debug, Display, Clone, Copy, Serialize, Deserialize, Default, EnumString, PartialEq, Eq, Hash)]
#[strum(serialize_all = "PascalCase")]
#[serde(rename_all = "PascalCase")]
pub enum OrderStatus {
Cancelled,
Expired,
Filled,
#[default]
New,
PartiallyFilled,
Triggered,
}
#[derive(Debug, Display, Clone, Copy, Serialize, Deserialize, Default, EnumString, PartialEq, Eq, Hash)]
#[strum(serialize_all = "PascalCase")]
#[serde(rename_all = "PascalCase")]
pub enum Side {
#[default]
Bid,
Ask,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct ExecuteOrderPayload {
#[serde(skip_serializing_if = "Option::is_none")]
pub client_id: Option<u32>,
pub order_type: OrderType,
#[serde(skip_serializing_if = "Option::is_none")]
pub post_only: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub price: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quote_quantity: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none")]
pub self_trade_prevention: Option<SelfTradePrevention>,
pub side: Side,
pub symbol: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<TimeInForce>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trigger_price: Option<Decimal>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct CancelOrderPayload {
pub symbol: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub order_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_id: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct CancelOpenOrdersPayload {
pub symbol: String,
}