use smallvec::SmallVec;
use crate::{
order::{
dependency::{
client::{CancelClientOrder, SubmitClientOrder},
remote::{CancelRemoteOrder, SubmitRemoteOrder},
},
ClientOrder, ClientOrderTracker, OrderAction, RemoteOrder, RemoteOrderTracker,
},
backend::LocalOrderId, instrument::InstrumentSpec,
};
use super::fill_policy::{FillPolicy, FillPolicyEnum};
pub type OrderBuilderDependencies<IS, const INLINE_LEN: usize> = SmallVec<[OrderBuilderDependency<IS>; INLINE_LEN]>;
#[derive(Debug, PartialEq, Eq, Hash)]
pub enum OrderBuilderDependency<IS: InstrumentSpec> {
Remote(RemoteOrderBuilderDependency<IS>),
Client(ClientOrderBuilderDependency<IS>),
}
impl<IS: InstrumentSpec> OrderBuilderDependency<IS> {
pub(super) fn as_local_order_id(
&self,
) -> &LocalOrderId {
match self {
Self::Remote(
dependency,
) => dependency.tracker.as_local_order_id(),
Self::Client(
dependency,
) => dependency.client_tracker.as_local_order_id(),
}
}
pub(super) fn create_submit_order_action<const INLINE_LEN: usize>(
&self,
dependencies: &OrderBuilderDependencies<IS, INLINE_LEN>,
) -> OrderAction<IS> {
match self {
Self::Remote(
dependency,
) => {
let dependencies = dependency.fill_policy.build_remote(
self,
dependencies,
);
OrderAction::SubmitRemote(
SubmitRemoteOrder::new(
dependency.tracker,
dependency.order,
dependencies,
),
)
},
Self::Client(
dependency,
) => {
let dependencies = dependency.fill_policy.build_client(
self,
dependencies,
);
OrderAction::SubmitClient(
SubmitClientOrder::new(
dependency.client_tracker,
dependency.client_order,
dependency.remote_tracker,
dependency.remote_order,
dependencies,
),
)
},
}
}
pub(super) fn create_cancel_order_action(
&self,
attempt_exposure_reversion: bool,
) -> OrderAction<IS> {
match self {
Self::Remote(
dependency,
) => {
OrderAction::CancelRemote(
CancelRemoteOrder::new(*dependency.tracker.as_local_order_id()),
)
},
Self::Client(
dependency,
) => {
OrderAction::CancelClient(
CancelClientOrder::new(
*dependency.client_tracker.as_local_order_id(),
attempt_exposure_reversion,
),
)
},
}
}
}
impl<IS: InstrumentSpec> From<RemoteOrderBuilderDependency<IS>> for OrderBuilderDependency<IS> {
fn from(
value: RemoteOrderBuilderDependency<IS>,
) -> Self {
Self::Remote(value)
}
}
impl<IS: InstrumentSpec> From<ClientOrderBuilderDependency<IS>> for OrderBuilderDependency<IS> {
fn from(
value: ClientOrderBuilderDependency<IS>,
) -> Self {
Self::Client(value)
}
}
#[derive(Debug, PartialEq, Eq, Hash)]
pub struct RemoteOrderBuilderDependency<IS: InstrumentSpec> {
pub(super) tracker: RemoteOrderTracker,
pub(super) order: RemoteOrder<IS>,
pub(super) fill_policy: FillPolicyEnum,
}
#[derive(Debug, PartialEq, Eq, Hash)]
pub struct ClientOrderBuilderDependency<IS: InstrumentSpec> {
pub(super) client_tracker: ClientOrderTracker,
pub(super) client_order: ClientOrder<IS>,
pub(super) remote_tracker: RemoteOrderTracker,
pub(super) remote_order: RemoteOrder<IS>,
pub(super) fill_policy: FillPolicyEnum,
}