use crate::{
order::{
builder::dependency::{OrderBuilderDependencies, OrderBuilderDependency},
ClientTimingCondition, OrderAction, RemoteTimingCondition, TimingCondition,
},
instrument::InstrumentSpec, volume::ExposureReversion,
};
use super::FillPolicy;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct CancelAllChildren(pub ExposureReversion);
impl FillPolicy for CancelAllChildren {
fn build_remote<
IS: InstrumentSpec,
const INLINE_LEN: usize,
>(
&self,
dependency: &OrderBuilderDependency<IS>,
dependencies: &OrderBuilderDependencies<IS, INLINE_LEN>,
) -> Vec<(
RemoteTimingCondition,
OrderAction<IS>,
)> {
dependencies
.iter()
.filter_map(move |
iter_dependency,
| {
if iter_dependency.as_local_order_id() == dependency.as_local_order_id() {
return None;
}
let order_action = iter_dependency.create_cancel_order_action(
self.0.is_enabled(),
);
let timing_condition = RemoteTimingCondition::FullyFilled;
Some((timing_condition, order_action))
}).collect()
}
fn build_client<
IS: InstrumentSpec,
const INLINE_LEN: usize,
>(
&self,
dependency: &OrderBuilderDependency<IS>,
dependencies: &OrderBuilderDependencies<IS, INLINE_LEN>,
) -> Vec<(
TimingCondition,
OrderAction<IS>,
)> {
dependencies
.iter()
.filter_map(move |
iter_dependency,
| {
if iter_dependency.as_local_order_id() == dependency.as_local_order_id() {
return None;
}
let order_action = iter_dependency.create_cancel_order_action(
self.0.is_enabled(),
);
let timing_condition = TimingCondition::Client(
ClientTimingCondition::Activated,
);
Some((timing_condition, order_action))
}).collect()
}
}