1mod capacity_spec;
2mod client_pending;
3mod completed;
4mod remote_pending;
5mod working;
6
7use thiserror::Error;
8use tracing::instrument;
9
10use crate::{
11 backend::{
12 LocalOrderId, OrderIdError, OrdersBackendSubmitRemoteOrderError, RemoteOrderId,
13 },
14 order::{DesiredVolumeOrderError, StateGoal},
15 instrument::InstrumentSpec,
16};
17
18pub use capacity_spec::*;
19pub use client_pending::*;
20pub use completed::*;
21pub use remote_pending::*;
22pub use working::*;
23
24#[derive(Debug, Error)]
25pub enum SubmitRemoteOrderError {
26 #[error("{0:?}")]
27 OrdersBackendSubmitRemoteOrderError(#[from] OrdersBackendSubmitRemoteOrderError),
28
29 #[error("{0:?}")]
30 DesiredVolumeOrderError(#[from] DesiredVolumeOrderError),
31}
32
33#[derive(Debug, Error)]
34pub enum TryCancelRemoteOrderError {
35 #[error("Unable to cancel order that is in a remote pending state.")]
36 Pending(RemoteOrderId),
37
38 #[error("Unable to cancel order that is partially filled at remote.")]
39 ParitallyFilled(RemoteOrderId),
40
41 #[error("{0:?}")]
42 OrderIdError(#[from] OrderIdError),
43}
44
45#[derive(Debug, Error)]
46pub(crate) enum RemotePartialFillError {
47 #[error("{0:?}")]
48 TrasitionRemoteWorkingOrderError(#[from] TrasitionRemoteWorkingOrderError),
49
50 #[error("{0:?}")]
51 OrderIdError(#[from] OrderIdError),
52}
53
54#[derive(Debug, Error)]
55pub(crate) enum TrasitionLocalOrderError {
56 #[error("{0:?}")]
57 OrderIdError(#[from] OrderIdError),
58
59 #[error("{0:?}")]
60 OrdersBackendSubmitRemoteOrderError(#[from] OrdersBackendSubmitRemoteOrderError),
61
62 #[error(
63 "{local_order_id:?} already is paired with {existing_remote_order_id:?} when attemping to transition to {attemped_remote_order_id:?}"
64 )]
65 AlreadyTransitioned {
66 local_order_id: LocalOrderId,
67 attemped_remote_order_id: RemoteOrderId,
68 existing_remote_order_id: RemoteOrderId,
69 },
70}
71
72#[derive(Debug, Error)]
73pub(crate) enum TransitionRemotePendingOrderError {
74 #[error("{0:?}")]
75 OrderIdError(#[from] OrderIdError),
76
77 #[error("{local_order_id:?} is already in a working state under {remote_order_id:?}.")]
78 AlreadyWorking {
79 local_order_id: LocalOrderId,
80 remote_order_id: RemoteOrderId,
81 },
82}
83
84#[derive(Debug, Error)]
85pub(crate) enum TrasitionRemoteWorkingOrderError {
86 #[error("{0:?}")]
87 OrderIdError(#[from] OrderIdError),
88
89 #[error("{0:?} already exists in a completed state.")]
90 AlreadyCompleted(RemoteOrderId),
91}
92
93#[derive(Debug, Error)]
94pub enum CancelOrderError {
95 #[error("No matching remote order id for: {0:?}")]
96 NoMatchingRemoteOrderId(LocalOrderId),
97
98 #[error("{0:?}")]
99 CancelLocalOrderError(#[from] CancelClientOrderError),
100
101 #[error("{0:?}")]
102 CancelRemoteOrderError(#[from] CancelRemoteOrderError),
103}
104
105#[derive(Debug, Error)]
106pub enum CancelClientOrderError {
107 #[error("{0:?}")]
108 OrderIdError(#[from] OrderIdError),
109}
110
111#[derive(Debug, Error)]
112pub enum CancelRemoteOrderError {
113 #[error("{0:?}")]
114 OrderIdError(#[from] OrderIdError),
115
116 #[error("{0:?}")]
117 DesiredVolumeOrderError(#[from] DesiredVolumeOrderError),
118
119 #[error("{0:?} has no RemoteOrderId assigned yet.")]
120 NoRemoteOrderId(LocalOrderId),
121}
122
123#[derive(Debug, Error)]
124pub enum CancelFlattenAllError {
125 #[error("Can not cancel flatten while there is an existing: {0:?}")]
126 ExistingStateGoal(StateGoal),
127}
128
129#[derive(Debug, Error)]
130pub enum RemoteCanceledRemoteOrderError {
131 #[error("{0:?}")]
132 OrderIdError(#[from] OrderIdError),
133
134 #[error("Order was already fully filled.")]
135 FullyFilled,
136}
137
138#[derive(Debug, Error)]
139pub enum AssignRemoteOrderIdError {
140 #[error("{0:?}")]
141 OrderIdError(#[from] OrderIdError),
142
143 #[error(
144 "Failed to assign {remote_order_id:?} to order with {local_order_id:?}. Already assigned {existing_remote_order_id:?}"
145 )]
146 AlreadyAssigned {
147 local_order_id: LocalOrderId,
148 remote_order_id: RemoteOrderId,
149 existing_remote_order_id: RemoteOrderId,
150 },
151}
152
153pub enum OrderGroupMut<
154 'a,
155 IS: InstrumentSpec,
156 CS: OrdersCapacitySpec,
157> {
158 PendingClient(&'a mut PendingClientOrders<IS, CS>),
159 PendingRemote(&'a mut PendingRemoteOrders<IS, CS>),
160 WorkingRemote(&'a mut WorkingRemoteOrders<IS, CS>),
161 CompletedRemote(&'a mut CompletedRemoteOrders<IS, CS>),
162}
163
164pub enum OrderRef<
165 'a,
166 IS: InstrumentSpec,
167 CS: OrdersCapacitySpec,
168> {
169 PendingClient {
170 pending_client_order: &'a PendingClientOrder<IS>,
171 pending_client_orders: &'a PendingClientOrders<IS, CS>,
172 },
173
174 PendingRemote {
175 pending_remote_order: &'a PendingRemoteOrder<IS, CS>,
176 pending_remote_orders: &'a PendingRemoteOrders<IS, CS>,
177 },
178
179 WorkingRemote {
180 working_remote_order: &'a WorkingRemoteOrder<IS, CS>,
181 working_remote_orders: &'a WorkingRemoteOrders<IS, CS>,
182 },
183
184 CompletedRemote {
185 completed_remote_order: &'a CompletedRemoteOrder<IS, CS>,
186 completed_remote_orders: &'a CompletedRemoteOrders<IS, CS>,
187 },
188}
189
190pub enum OrderMut<
191 'a,
192 IS: InstrumentSpec,
193 CS: OrdersCapacitySpec,
194> {
195 PendingClient(&'a mut PendingClientOrder<IS>),
196 PendingRemote(&'a mut PendingRemoteOrder<IS, CS>),
197 WorkingRemote(&'a mut WorkingRemoteOrder<IS, CS>),
198 CompletedRemote(&'a mut CompletedRemoteOrder<IS, CS>),
199}
200
201pub struct OrderManager<
202 IS: InstrumentSpec,
203 CS: OrdersCapacitySpec,
204> {
205 pub(crate) pending_client_orders: PendingClientOrders<IS, CS>,
206 pub(crate) pending_remote_orders: PendingRemoteOrders<IS, CS>,
207 pub(crate) working_remote_orders: WorkingRemoteOrders<IS, CS>,
208 pub(crate) completed_remote_orders: CompletedRemoteOrders<IS, CS>,
209}
210
211impl<
212 IS: InstrumentSpec,
213 CS: OrdersCapacitySpec,
214> OrderManager<IS, CS> {
215 pub fn pending_client_orders(
216 &self,
217 ) -> &PendingClientOrders<IS, CS> {
218 &self.pending_client_orders
219 }
220
221 pub fn pending_remote_orders(
222 &self,
223 ) -> &PendingRemoteOrders<IS, CS> {
224 &self.pending_remote_orders
225 }
226
227 pub fn working_remote_orders(
228 &self,
229 ) -> &WorkingRemoteOrders<IS, CS> {
230 &self.working_remote_orders
231 }
232
233 pub fn completed_remote_orders(
234 &self,
235 ) -> &CompletedRemoteOrders<IS, CS> {
236 &self.completed_remote_orders
237 }
238
239 #[instrument(skip_all)]
240 pub fn find_order(
241 &self,
242 local_order_id: &LocalOrderId,
243 ) -> Result<OrderRef<'_, IS, CS>, OrderIdError> {
244 if let Ok(
245 pending_client_order,
246 ) = self.pending_client_orders.get(
247 local_order_id,
248 ) {
249 return Ok(OrderRef::PendingClient {
250 pending_client_order,
251 pending_client_orders: &self.pending_client_orders,
252 });
253 }
254
255 if let Ok(
256 pending_remote_order,
257 ) = self.pending_remote_orders.get(
258 local_order_id,
259 ) {
260 return Ok(OrderRef::PendingRemote {
261 pending_remote_order,
262 pending_remote_orders: &self.pending_remote_orders,
263 });
264 }
265
266 if let Ok(
267 working_remote_order,
268 ) = self.working_remote_orders.get(
269 local_order_id,
270 ) {
271 return Ok(OrderRef::WorkingRemote {
272 working_remote_order,
273 working_remote_orders: &self.working_remote_orders,
274 });
275 }
276
277 if let Ok(
278 completed_remote_order,
279 ) = self.completed_remote_orders.get(
280 local_order_id,
281 ) {
282 return Ok(OrderRef::CompletedRemote {
283 completed_remote_order,
284 completed_remote_orders: &self.completed_remote_orders,
285 });
286 }
287
288 local_order_id.err_invalid()
289 }
290
291 #[instrument(skip_all)]
292 pub(crate) fn find_order_mut(
293 &mut self,
294 local_order_id: &LocalOrderId,
295 ) -> Result<OrderMut<'_, IS, CS>, OrderIdError> {
296 if let Ok(
297 pending_client_order,
298 ) = self.pending_client_orders.get_mut(
299 local_order_id,
300 ) {
301 return Ok(OrderMut::PendingClient(pending_client_order));
302 }
303
304 if let Ok(
305 pending_remote_order,
306 ) = self.pending_remote_orders.get_mut(
307 local_order_id,
308 ) {
309 return Ok(OrderMut::PendingRemote(pending_remote_order));
310 }
311
312 if let Ok(
313 working_remote_order,
314 ) = self.working_remote_orders.get_mut(
315 local_order_id,
316 ) {
317 return Ok(OrderMut::WorkingRemote(working_remote_order));
318 }
319
320 if let Ok(
321 completed_remote_order,
322 ) = self.completed_remote_orders.get_mut(
323 local_order_id,
324 ) {
325 return Ok(OrderMut::CompletedRemote(completed_remote_order));
326 }
327
328 local_order_id.err_invalid()
329 }
330
331 #[instrument(skip_all)]
332 pub(crate) fn find_order_group_mut(
333 &mut self,
334 local_order_id: &LocalOrderId,
335 ) -> Result<OrderGroupMut<'_, IS, CS>, OrderIdError> {
336 if self.pending_client_orders.get(local_order_id).is_ok() {
337 return Ok(OrderGroupMut::PendingClient(&mut self.pending_client_orders));
338 }
339
340 if self.pending_remote_orders.get(local_order_id).is_ok() {
341 return Ok(OrderGroupMut::PendingRemote(&mut self.pending_remote_orders));
342 }
343
344 if self.working_remote_orders.get(local_order_id).is_ok() {
345 return Ok(OrderGroupMut::WorkingRemote(&mut self.working_remote_orders));
346 }
347
348 if self.completed_remote_orders.get(local_order_id).is_ok() {
349 return Ok(OrderGroupMut::CompletedRemote(&mut self.completed_remote_orders));
350 }
351
352 local_order_id.err_invalid()
353 }
354}
355
356impl<
357 IS: InstrumentSpec,
358 CS: OrdersCapacitySpec,
359> Default for OrderManager<IS, CS> {
360 fn default() -> Self {
361 Self {
362 pending_client_orders: PendingClientOrders::default(),
363 pending_remote_orders: PendingRemoteOrders::default(),
364 working_remote_orders: WorkingRemoteOrders::default(),
365 completed_remote_orders: CompletedRemoteOrders::default(),
366 }
367 }
368}