pub mod cancel;
pub mod modify;
pub mod query;
pub mod report;
pub mod submit;
use nautilus_core::{Params, UnixNanos};
use nautilus_model::{
identifiers::{ClientId, InstrumentId, StrategyId},
reports::{ExecutionMassStatus, FillReport, OrderStatusReport, PositionStatusReport},
};
use strum::Display;
pub use self::{
cancel::{BatchCancelOrders, CancelAllOrders, CancelOrder},
modify::ModifyOrder,
query::{QueryAccount, QueryOrder},
report::{
GenerateExecutionMassStatus, GenerateExecutionMassStatusBuilder, GenerateFillReports,
GenerateFillReportsBuilder, GenerateOrderStatusReport, GenerateOrderStatusReportBuilder,
GenerateOrderStatusReports, GenerateOrderStatusReportsBuilder,
GeneratePositionStatusReports, GeneratePositionStatusReportsBuilder,
},
submit::{SubmitOrder, SubmitOrderList},
};
#[derive(Clone, Debug, Display)]
pub enum ExecutionReport {
Order(Box<OrderStatusReport>),
Fill(Box<FillReport>),
OrderWithFills(Box<OrderStatusReport>, Vec<FillReport>),
Position(Box<PositionStatusReport>),
MassStatus(Box<ExecutionMassStatus>),
}
#[expect(clippy::large_enum_variant)]
#[derive(Clone, Debug, Eq, PartialEq, Display)]
pub enum TradingCommand {
SubmitOrder(SubmitOrder),
SubmitOrderList(SubmitOrderList),
ModifyOrder(ModifyOrder),
CancelOrder(CancelOrder),
CancelAllOrders(CancelAllOrders),
BatchCancelOrders(BatchCancelOrders),
QueryOrder(QueryOrder),
QueryAccount(QueryAccount),
}
impl TradingCommand {
#[must_use]
pub const fn client_id(&self) -> Option<ClientId> {
match self {
Self::SubmitOrder(command) => command.client_id,
Self::SubmitOrderList(command) => command.client_id,
Self::ModifyOrder(command) => command.client_id,
Self::CancelOrder(command) => command.client_id,
Self::CancelAllOrders(command) => command.client_id,
Self::BatchCancelOrders(command) => command.client_id,
Self::QueryOrder(command) => command.client_id,
Self::QueryAccount(command) => command.client_id,
}
}
#[must_use]
pub const fn instrument_id(&self) -> InstrumentId {
match self {
Self::SubmitOrder(command) => command.instrument_id,
Self::SubmitOrderList(command) => command.instrument_id,
Self::ModifyOrder(command) => command.instrument_id,
Self::CancelOrder(command) => command.instrument_id,
Self::CancelAllOrders(command) => command.instrument_id,
Self::BatchCancelOrders(command) => command.instrument_id,
Self::QueryOrder(command) => command.instrument_id,
Self::QueryAccount(_) => panic!("No instrument ID for command"),
}
}
#[must_use]
pub const fn ts_init(&self) -> UnixNanos {
match self {
Self::SubmitOrder(command) => command.ts_init,
Self::SubmitOrderList(command) => command.ts_init,
Self::ModifyOrder(command) => command.ts_init,
Self::CancelOrder(command) => command.ts_init,
Self::CancelAllOrders(command) => command.ts_init,
Self::BatchCancelOrders(command) => command.ts_init,
Self::QueryOrder(command) => command.ts_init,
Self::QueryAccount(command) => command.ts_init,
}
}
#[must_use]
pub const fn strategy_id(&self) -> Option<StrategyId> {
match self {
Self::SubmitOrder(command) => Some(command.strategy_id),
Self::SubmitOrderList(command) => Some(command.strategy_id),
Self::ModifyOrder(command) => Some(command.strategy_id),
Self::CancelOrder(command) => Some(command.strategy_id),
Self::CancelAllOrders(command) => Some(command.strategy_id),
Self::BatchCancelOrders(command) => Some(command.strategy_id),
Self::QueryOrder(command) => Some(command.strategy_id),
Self::QueryAccount(_) => None,
}
}
#[must_use]
pub const fn params(&self) -> Option<&Params> {
match self {
Self::SubmitOrder(command) => command.params.as_ref(),
Self::SubmitOrderList(command) => command.params.as_ref(),
Self::ModifyOrder(command) => command.params.as_ref(),
Self::CancelOrder(command) => command.params.as_ref(),
Self::CancelAllOrders(command) => command.params.as_ref(),
Self::BatchCancelOrders(command) => command.params.as_ref(),
Self::QueryOrder(command) => command.params.as_ref(),
Self::QueryAccount(command) => command.params.as_ref(),
}
}
}