use client::{CancelClientOrder, ClientOrderAction, SubmitClientOrder};
use remote::{CancelRemoteOrder, RemoteOrderAction, SubmitRemoteOrder};
use thiserror::Error;
use crate::{
backend::{OrderIdError, OrderIdGenerator, OrdersBackend},
instrument::InstrumentSpec,
order_manager::{
CancelRemoteOrderError, OrderManager, OrdersCapacitySpec, PendingClientCancelError,
PendingRemoteSubmitError,
},
timestamp::TickTimestamp,
volume::DirectionalExposure,
};
use super::{ActiveOrderGoals, ActiveStateGoal, DesiredVolumeOrderError};
pub mod client;
mod deferred;
pub mod remote;
pub use deferred::*;
#[derive(Debug, Error)]
pub enum TriggerError {
#[error("{0:?}")]
DesiredVolumeOrder(#[from] DesiredVolumeOrderError),
#[error("{0:?}")]
PendingRemoteSubmitError(#[from] PendingRemoteSubmitError),
#[error("{0:?}")]
PendingClientCancel(#[from] PendingClientCancelError),
#[error("{0:?}")]
OrderId(#[from] OrderIdError),
#[error("{0:?}")]
CancelRemoteOrder(#[from] CancelRemoteOrderError),
}
pub(crate) trait OrderDependency<IS: InstrumentSpec> {
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>,
active_order_goals: &mut ActiveOrderGoals<IS>,
active_state_goal: &mut ActiveStateGoal,
) -> impl Future<Output = Result<(), TriggerError>>
where
IS: Send;
}
#[derive(Debug)]
pub enum OrderAction<IS: InstrumentSpec> {
SubmitRemote(SubmitRemoteOrder<IS>),
SubmitClient(SubmitClientOrder<IS>),
CancelRemote(CancelRemoteOrder),
CancelClient(CancelClientOrder),
}
impl<IS: InstrumentSpec> OrderDependency<IS> for OrderAction<IS> {
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>,
active_order_goals: &mut ActiveOrderGoals<IS>,
active_state_goal: &mut ActiveStateGoal,
) -> Result<(), TriggerError>
where
IS: Send,
{
match self {
Self::SubmitRemote(order) => {
order
.trigger(
tick_timestamp,
order_manager,
orders_backend,
order_id_generator,
directional_exposure,
active_order_goals,
active_state_goal,
)
.await
}
Self::SubmitClient(order) => {
order
.trigger(
tick_timestamp,
order_manager,
orders_backend,
order_id_generator,
directional_exposure,
active_order_goals,
active_state_goal,
)
.await
}
Self::CancelRemote(order) => {
order
.trigger(
tick_timestamp,
order_manager,
orders_backend,
order_id_generator,
directional_exposure,
active_order_goals,
active_state_goal,
)
.await
}
Self::CancelClient(order) => {
order
.trigger(
tick_timestamp,
order_manager,
orders_backend,
order_id_generator,
directional_exposure,
active_order_goals,
active_state_goal,
)
.await
}
}
}
}
impl<IS: InstrumentSpec> From<ClientOrderAction<IS>> for OrderAction<IS> {
fn from(value: ClientOrderAction<IS>) -> Self {
match value {
ClientOrderAction::SubmitRemoteOrder(submit_remote_order) => {
Self::SubmitRemote(submit_remote_order)
}
ClientOrderAction::SubmitClientOrder(submit_client_order) => {
Self::SubmitClient(submit_client_order)
}
ClientOrderAction::CancelRemoteOrder(cancel_remote_order) => {
Self::CancelRemote(cancel_remote_order)
}
ClientOrderAction::CancelClientOrder(cancel_client_order) => {
Self::CancelClient(cancel_client_order)
}
}
}
}
impl<IS: InstrumentSpec> From<RemoteOrderAction<IS>> for OrderAction<IS> {
fn from(value: RemoteOrderAction<IS>) -> Self {
match value {
RemoteOrderAction::SubmitRemoteOrder(submit_remote_order) => {
Self::SubmitRemote(submit_remote_order)
}
RemoteOrderAction::SubmitClientOrder(submit_client_order) => {
Self::SubmitClient(submit_client_order)
}
RemoteOrderAction::CancelRemoteOrder(cancel_remote_order) => {
Self::CancelRemote(cancel_remote_order)
}
RemoteOrderAction::CancelClientOrder(cancel_client_order) => {
Self::CancelClient(cancel_client_order)
}
}
}
}
impl<IS: InstrumentSpec> From<SubmitRemoteOrder<IS>> for OrderAction<IS> {
fn from(value: SubmitRemoteOrder<IS>) -> Self {
Self::SubmitRemote(value)
}
}
impl<IS: InstrumentSpec> From<SubmitClientOrder<IS>> for OrderAction<IS> {
fn from(value: SubmitClientOrder<IS>) -> Self {
Self::SubmitClient(value)
}
}
impl<IS: InstrumentSpec> From<CancelRemoteOrder> for OrderAction<IS> {
fn from(value: CancelRemoteOrder) -> Self {
Self::CancelRemote(value)
}
}
impl<IS: InstrumentSpec> From<CancelClientOrder> for OrderAction<IS> {
fn from(value: CancelClientOrder) -> Self {
Self::CancelClient(value)
}
}