use crate::core::request_trait::HasLock;
use crate::impl_request_has_field;
use crate::param::{Fee, Pnl, PositionEffect, PositionSide, Quantity, Side, Trade};
use crate::pretrade::Lock;
use super::{
HasExecutionReportIsTerminal, HasExecutionReportLastTrade, HasExecutionReportPositionEffect,
HasExecutionReportPositionSide, HasFee, HasInstrument, HasLeavesQuantity, HasPnl, HasSide,
Instrument,
};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ExecutionReportOperation {
pub instrument: Instrument,
pub side: Side,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct WithExecutionReportOperation<T> {
pub inner: T,
pub operation: ExecutionReportOperation,
}
impl_request_has_field!(
HasInstrument,
instrument,
&Instrument,
ExecutionReportOperation,
instrument,
WithExecutionReportOperation,
operation,
);
impl_request_has_field!(
HasSide,
side,
Side,
ExecutionReportOperation,
side,
WithExecutionReportOperation,
operation,
);
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FinancialImpact {
pub pnl: Pnl,
pub fee: Fee,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct WithFinancialImpact<T> {
pub inner: T,
pub financial_impact: FinancialImpact,
}
impl_request_has_field!(
HasPnl,
pnl,
Pnl,
FinancialImpact,
pnl,
WithFinancialImpact,
financial_impact,
);
impl_request_has_field!(
HasFee,
fee,
Fee,
FinancialImpact,
fee,
WithFinancialImpact,
financial_impact,
);
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ExecutionReportFillDetails {
pub last_trade: Option<Trade>,
pub leaves_quantity: Quantity,
pub lock: Lock,
pub is_terminal: bool,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct WithExecutionReportFillDetails<T> {
pub inner: T,
pub fill: ExecutionReportFillDetails,
}
impl_request_has_field!(
HasExecutionReportLastTrade,
last_trade,
Option<Trade>,
ExecutionReportFillDetails,
last_trade,
WithExecutionReportFillDetails,
fill,
);
impl_request_has_field!(
HasLeavesQuantity,
leaves_quantity,
Quantity,
ExecutionReportFillDetails,
leaves_quantity,
WithExecutionReportFillDetails,
fill,
);
impl_request_has_field!(
HasLock,
lock,
Lock,
ExecutionReportFillDetails,
lock,
WithExecutionReportFillDetails,
fill,
);
impl_request_has_field!(
HasExecutionReportIsTerminal,
is_terminal,
bool,
ExecutionReportFillDetails,
is_terminal,
WithExecutionReportFillDetails,
fill,
);
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct ExecutionReportPositionImpact {
pub position_effect: Option<PositionEffect>,
pub position_side: Option<PositionSide>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct WithExecutionReportPositionImpact<T> {
pub inner: T,
pub position_impact: ExecutionReportPositionImpact,
}
impl_request_has_field!(
HasExecutionReportPositionEffect,
position_effect,
Option<PositionEffect>,
ExecutionReportPositionImpact,
position_effect,
WithExecutionReportPositionImpact,
position_impact,
);
impl_request_has_field!(
HasExecutionReportPositionSide,
position_side,
Option<PositionSide>,
ExecutionReportPositionImpact,
position_side,
WithExecutionReportPositionImpact,
position_impact,
);
#[cfg(test)]
mod tests {
use crate::param::Quantity;
use crate::pretrade::Lock;
use super::ExecutionReportFillDetails;
fn fill() -> ExecutionReportFillDetails {
ExecutionReportFillDetails {
last_trade: None,
leaves_quantity: Quantity::from_str("0").expect("must be valid"),
lock: Lock::default(),
is_terminal: false,
}
}
#[test]
fn fill_defaults_are_stable() {
let f = fill();
assert_eq!(f.last_trade, None);
assert_eq!(
f.leaves_quantity,
Quantity::from_str("0").expect("must be valid")
);
assert_eq!(f.lock, Lock::default());
assert!(!f.is_terminal);
}
}