use nautilus_network::websocket::WebSocketClient;
use serde::{Deserialize, Serialize};
use super::user_data::{
BinanceSpotAccountPositionMsg, BinanceSpotBalanceUpdateMsg, BinanceSpotExecutionReport,
};
use crate::spot::http::{
models::{BinanceCancelOrderResponse, BinanceNewOrderResponse},
query::{CancelOrderParams, CancelReplaceOrderParams, NewOrderParams},
};
#[allow(
missing_debug_implementations,
clippy::large_enum_variant,
reason = "Commands are ephemeral and immediately consumed"
)]
pub enum BinanceSpotWsTradingCommand {
SetClient(WebSocketClient),
Disconnect,
PlaceOrder {
id: String,
params: NewOrderParams,
},
CancelOrder {
id: String,
params: CancelOrderParams,
},
CancelReplaceOrder {
id: String,
params: CancelReplaceOrderParams,
},
CancelAllOrders {
id: String,
symbol: String,
},
SessionLogon,
SubscribeUserData,
}
#[derive(Debug, Clone)]
pub enum BinanceSpotWsTradingMessage {
Connected,
Authenticated,
Reconnected,
OrderAccepted {
request_id: String,
response: BinanceNewOrderResponse,
},
OrderRejected {
request_id: String,
code: i32,
msg: String,
},
OrderCanceled {
request_id: String,
response: BinanceCancelOrderResponse,
},
CancelRejected {
request_id: String,
code: i32,
msg: String,
},
CancelReplaceAccepted {
request_id: String,
cancel_response: BinanceCancelOrderResponse,
new_order_response: BinanceNewOrderResponse,
},
CancelReplaceRejected {
request_id: String,
code: i32,
msg: String,
},
AllOrdersCanceled {
request_id: String,
responses: Vec<BinanceCancelOrderResponse>,
},
UserDataSubscribed {
subscription_id: String,
},
ExecutionReport(Box<BinanceSpotExecutionReport>),
AccountPosition(BinanceSpotAccountPositionMsg),
BalanceUpdate(BinanceSpotBalanceUpdateMsg),
Error(String),
}
#[derive(Debug, Clone, Copy)]
pub enum BinanceSpotWsTradingRequestMeta {
PlaceOrder,
CancelOrder,
CancelReplaceOrder,
CancelAllOrders,
SessionLogon,
SubscribeUserData,
}
#[derive(Debug, Clone, Serialize)]
pub struct BinanceSpotWsTradingRequest {
pub id: String,
pub method: String,
pub params: serde_json::Value,
}
impl BinanceSpotWsTradingRequest {
#[must_use]
pub fn new(
id: impl Into<String>,
method: impl Into<String>,
params: serde_json::Value,
) -> Self {
Self {
id: id.into(),
method: method.into(),
params,
}
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct BinanceSpotWsTradingResponseError {
pub code: i32,
pub msg: String,
pub id: Option<String>,
}
pub mod method {
pub const ORDER_PLACE: &str = "order.place";
pub const ORDER_CANCEL: &str = "order.cancel";
pub const ORDER_CANCEL_REPLACE: &str = "order.cancelReplace";
pub const OPEN_ORDERS_CANCEL_ALL: &str = "openOrders.cancelAll";
pub const SESSION_LOGON: &str = "session.logon";
pub const SESSION_STATUS: &str = "session.status";
pub const SESSION_LOGOUT: &str = "session.logout";
}