use crate::core::instrument::Instrument;
use crate::param::{
AccountId, AdjustmentAmount, Asset, PositionSize, Price, Quantity, Side, Trade, TradeAmount,
};
use crate::pretrade::holdings::Holdings;
use crate::pretrade::PreTradeLock;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(super) enum LegKind {
Underlying,
Settlement,
}
pub(super) struct OrderRequestView<'i> {
pub(super) instrument: &'i Instrument,
pub(super) account_id: AccountId,
pub(super) side: Side,
pub(super) trade_amount: TradeAmount,
pub(super) price: Option<Price>,
}
pub(super) struct AdjustmentRequestView {
pub(super) asset: Asset,
pub(super) balance: Option<AdjustmentAmount>,
pub(super) balance_lower: Option<PositionSize>,
pub(super) balance_upper: Option<PositionSize>,
pub(super) held: Option<AdjustmentAmount>,
pub(super) held_lower: Option<PositionSize>,
pub(super) held_upper: Option<PositionSize>,
pub(super) incoming: Option<AdjustmentAmount>,
pub(super) incoming_lower: Option<PositionSize>,
pub(super) incoming_upper: Option<PositionSize>,
}
pub(super) struct ExecutionRequestView<'i> {
pub(super) instrument: &'i Instrument,
pub(super) account_id: AccountId,
pub(super) side: Side,
pub(super) last_trade: Option<Trade>,
pub(super) leaves_quantity: Quantity,
pub(super) is_final: bool,
pub(super) lock: PreTradeLock,
}
#[derive(Clone, Copy)]
pub(super) struct LegDelta {
pub(super) held_delta: PositionSize,
pub(super) balance_delta: PositionSize,
pub(super) final_holdings: Option<Holdings>,
}
impl LegDelta {
fn new() -> Self {
Self {
held_delta: PositionSize::ZERO,
balance_delta: PositionSize::ZERO,
final_holdings: None,
}
}
}
pub(super) struct FillCancelDeltas {
pub(super) underlying: LegDelta,
pub(super) settlement: LegDelta,
}
impl FillCancelDeltas {
pub(super) fn new() -> Self {
Self {
underlying: LegDelta::new(),
settlement: LegDelta::new(),
}
}
pub(super) fn leg_mut(&mut self, kind: LegKind) -> &mut LegDelta {
match kind {
LegKind::Underlying => &mut self.underlying,
LegKind::Settlement => &mut self.settlement,
}
}
}