use tracing::instrument;
#[allow(unused_imports)]
use tracing::trace;
use crate::{
backend::{LocalOrderId, OrderIdGenerator, OrdersBackend},
order::{OrderDependency, StateGoal, TriggerError},
order_manager::{OrderManager, OrdersCapacitySpec},
instrument::InstrumentSpec, timestamp::TickTimestamp, volume::DirectionalExposure,
};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct CancelRemoteOrder {
pub local_order_id: LocalOrderId,
}
impl CancelRemoteOrder {
pub fn new(
local_order_id: LocalOrderId,
) -> Self {
Self { local_order_id }
}
}
impl<IS: InstrumentSpec> OrderDependency<IS> for CancelRemoteOrder {
#[instrument(skip_all)]
async fn trigger<
OB: OrdersBackend<IS>,
CS: OrdersCapacitySpec,
>(
&self,
tick_timestamp: &TickTimestamp,
order_manager: &mut OrderManager<IS, CS>,
orders_backend: &mut OB,
order_id_generator: &mut OrderIdGenerator,
directional_exposure: &mut DirectionalExposure<IS>,
state_goal: &mut StateGoal,
) -> Result<bool, TriggerError>
where
IS: Send,
{
#[cfg(feature = "log-trace-order-actions")]
trace!("Triggered order action: `{self:#?}`.");
let working_remote_order = match order_manager.working_remote_orders.get_with_local(
&self.local_order_id,
) {
Ok(
working_remote_order,
) => working_remote_order,
result_order_id_error => {
if let Ok(
pending_remote_order,
) = order_manager.pending_remote_orders.get_mut(
&self.local_order_id,
) {
pending_remote_order.cancel_on_process = true;
}
return Ok(true);
},
};
orders_backend.initiate_cancel_order(
&working_remote_order.remote_order_id,
).await?;
Ok(true)
}
}