apple-quant-algorithmic 0.3.0

Apple Quant's algorithmic library.
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,
}