nautilus_execution/matching_core/
handlers.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2025 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16use std::{cell::RefCell, rc::Rc};
17
18use nautilus_model::orders::OrderAny;
19
20use crate::{
21    matching_engine::engine::OrderMatchingEngine, order_emulator::emulator::OrderEmulator,
22};
23
24pub trait FillMarketOrderHandler {
25    fn fill_market_order(&mut self, order: &OrderAny);
26}
27
28#[derive(Clone)]
29pub enum FillMarketOrderHandlerAny {
30    OrderMatchingEngine(Rc<RefCell<OrderMatchingEngine>>),
31    OrderEmulator(Rc<RefCell<OrderEmulator>>),
32}
33
34impl FillMarketOrderHandler for FillMarketOrderHandlerAny {
35    fn fill_market_order(&mut self, order: &OrderAny) {
36        match self {
37            Self::OrderMatchingEngine(engine) => {
38                engine.borrow_mut().fill_market_order(&mut order.clone());
39            }
40            Self::OrderEmulator(emulator) => {
41                emulator.borrow_mut().fill_market_order(&mut order.clone());
42            }
43        }
44    }
45}
46
47#[derive(Clone)]
48pub struct ShareableFillMarketOrderHandler(pub FillMarketOrderHandlerAny);
49
50pub trait FillLimitOrderHandler {
51    fn fill_limit_order(&mut self, order: &mut OrderAny);
52}
53
54#[derive(Clone)]
55pub enum FillLimitOrderHandlerAny {
56    OrderMatchingEngine(Rc<RefCell<OrderMatchingEngine>>),
57    OrderEmulator(Rc<RefCell<OrderEmulator>>),
58}
59
60impl FillLimitOrderHandler for FillLimitOrderHandlerAny {
61    fn fill_limit_order(&mut self, order: &mut OrderAny) {
62        match self {
63            Self::OrderMatchingEngine(engine) => {
64                engine.borrow_mut().fill_limit_order(order);
65            }
66            Self::OrderEmulator(emulator) => {
67                emulator.borrow_mut().fill_limit_order(order);
68            }
69        }
70    }
71}
72
73#[derive(Clone)]
74pub struct ShareableFillLimitOrderHandler(pub FillLimitOrderHandlerAny);
75
76pub trait TriggerStopOrderHandler {
77    fn trigger_stop_order(&mut self, order: &mut OrderAny);
78}
79
80#[derive(Clone)]
81pub enum TriggerStopOrderHandlerAny {
82    OrderMatchingEngine(Rc<RefCell<OrderMatchingEngine>>),
83    OrderEmulator(Rc<RefCell<OrderEmulator>>),
84}
85
86impl TriggerStopOrderHandler for TriggerStopOrderHandlerAny {
87    fn trigger_stop_order(&mut self, order: &mut OrderAny) {
88        match self {
89            Self::OrderMatchingEngine(engine) => {
90                engine.borrow_mut().trigger_stop_order(order);
91            }
92            Self::OrderEmulator(emulator) => {
93                emulator.borrow_mut().trigger_stop_order(order);
94            }
95        }
96    }
97}
98
99#[derive(Clone)]
100pub struct ShareableTriggerStopOrderHandler(pub TriggerStopOrderHandlerAny);