nautilus_plugin/surfaces/commands/
cancel.rs1#![allow(unsafe_code)]
26
27use std::ops::Deref;
28
29use nautilus_core::Params;
30use nautilus_model::{
31 enums::OrderSide,
32 identifiers::{ClientId, ClientOrderId, InstrumentId},
33};
34
35#[repr(C)]
37#[derive(Debug, Clone, PartialEq, Eq)]
38pub struct CancelOrderCommand {
39 pub client_order_id: ClientOrderId,
41
42 pub client_id: Option<ClientId>,
44
45 pub params: Option<Params>,
47}
48
49impl CancelOrderCommand {
50 #[must_use]
52 pub const fn new(
53 client_order_id: ClientOrderId,
54 client_id: Option<ClientId>,
55 params: Option<Params>,
56 ) -> Self {
57 Self {
58 client_order_id,
59 client_id,
60 params,
61 }
62 }
63}
64
65#[repr(C)]
73#[derive(Debug, Clone)]
74pub struct CancelOrderHandle(Box<CancelOrderCommand>);
75
76impl CancelOrderHandle {
77 #[must_use]
79 pub fn new(command: CancelOrderCommand) -> Self {
80 Self(Box::new(command))
81 }
82
83 #[must_use]
85 pub fn command(&self) -> &CancelOrderCommand {
86 &self.0
87 }
88
89 #[must_use]
91 pub fn into_inner(self) -> CancelOrderCommand {
92 *self.0
93 }
94}
95
96impl Deref for CancelOrderHandle {
97 type Target = CancelOrderCommand;
98
99 fn deref(&self) -> &Self::Target {
100 &self.0
101 }
102}
103
104#[repr(C)]
106#[derive(Debug, Clone, PartialEq, Eq)]
107pub struct CancelOrdersCommand {
108 pub client_order_ids: Vec<ClientOrderId>,
110
111 pub client_id: Option<ClientId>,
113
114 pub params: Option<Params>,
116}
117
118impl CancelOrdersCommand {
119 #[must_use]
121 pub const fn new(
122 client_order_ids: Vec<ClientOrderId>,
123 client_id: Option<ClientId>,
124 params: Option<Params>,
125 ) -> Self {
126 Self {
127 client_order_ids,
128 client_id,
129 params,
130 }
131 }
132}
133
134#[repr(C)]
137#[derive(Debug, Clone)]
138pub struct CancelOrdersHandle(Box<CancelOrdersCommand>);
139
140impl CancelOrdersHandle {
141 #[must_use]
143 pub fn new(command: CancelOrdersCommand) -> Self {
144 Self(Box::new(command))
145 }
146
147 #[must_use]
149 pub fn command(&self) -> &CancelOrdersCommand {
150 &self.0
151 }
152
153 #[must_use]
155 pub fn into_inner(self) -> CancelOrdersCommand {
156 *self.0
157 }
158}
159
160impl Deref for CancelOrdersHandle {
161 type Target = CancelOrdersCommand;
162
163 fn deref(&self) -> &Self::Target {
164 &self.0
165 }
166}
167
168#[repr(C)]
170#[derive(Debug, Clone, PartialEq, Eq)]
171pub struct CancelAllOrdersCommand {
172 pub instrument_id: InstrumentId,
174
175 pub order_side: Option<OrderSide>,
177
178 pub client_id: Option<ClientId>,
180
181 pub params: Option<Params>,
183}
184
185impl CancelAllOrdersCommand {
186 #[must_use]
188 pub const fn new(
189 instrument_id: InstrumentId,
190 order_side: Option<OrderSide>,
191 client_id: Option<ClientId>,
192 params: Option<Params>,
193 ) -> Self {
194 Self {
195 instrument_id,
196 order_side,
197 client_id,
198 params,
199 }
200 }
201}
202
203#[repr(C)]
206#[derive(Debug, Clone)]
207pub struct CancelAllOrdersHandle(Box<CancelAllOrdersCommand>);
208
209impl CancelAllOrdersHandle {
210 #[must_use]
212 pub fn new(command: CancelAllOrdersCommand) -> Self {
213 Self(Box::new(command))
214 }
215
216 #[must_use]
218 pub fn command(&self) -> &CancelAllOrdersCommand {
219 &self.0
220 }
221
222 #[must_use]
224 pub fn into_inner(self) -> CancelAllOrdersCommand {
225 *self.0
226 }
227}
228
229impl Deref for CancelAllOrdersHandle {
230 type Target = CancelAllOrdersCommand;
231
232 fn deref(&self) -> &Self::Target {
233 &self.0
234 }
235}
236
237#[cfg(test)]
238mod tests {
239 use nautilus_model::{
240 enums::OrderSide,
241 identifiers::{ClientOrderId, InstrumentId},
242 };
243 use rstest::rstest;
244
245 use super::*;
246
247 #[rstest]
248 fn cancel_order_handle_round_trips_command() {
249 let cmd = CancelOrderCommand::new(ClientOrderId::from("O-1"), None, None);
250 let handle = CancelOrderHandle::new(cmd.clone());
251 assert_eq!(handle.command(), &cmd);
252 assert_eq!(&*handle, &cmd);
253 assert_eq!(handle.into_inner(), cmd);
254 }
255
256 #[rstest]
257 fn cancel_orders_handle_round_trips_command() {
258 let cmd = CancelOrdersCommand::new(
259 vec![ClientOrderId::from("O-1"), ClientOrderId::from("O-2")],
260 None,
261 None,
262 );
263 let handle = CancelOrdersHandle::new(cmd.clone());
264 assert_eq!(handle.command(), &cmd);
265 assert_eq!(&*handle, &cmd);
266 assert_eq!(handle.into_inner(), cmd);
267 }
268
269 #[rstest]
270 fn cancel_all_orders_handle_round_trips_command() {
271 let cmd = CancelAllOrdersCommand::new(
272 InstrumentId::from("ETH-USDT.BINANCE"),
273 Some(OrderSide::Buy),
274 None,
275 None,
276 );
277 let handle = CancelAllOrdersHandle::new(cmd.clone());
278 assert_eq!(handle.command(), &cmd);
279 assert_eq!(&*handle, &cmd);
280 assert_eq!(handle.into_inner(), cmd);
281 }
282}