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 nautilus_core::WeakCell;
17use nautilus_model::orders::OrderAny;
18
19use crate::{
20    matching_engine::engine::OrderMatchingEngine, order_emulator::emulator::OrderEmulator,
21};
22
23pub trait FillMarketOrderHandler {
24    fn fill_market_order(&mut self, order: &OrderAny);
25}
26
27#[derive(Clone, Debug)]
28pub enum FillMarketOrderHandlerAny {
29    OrderMatchingEngine(WeakCell<OrderMatchingEngine>),
30    OrderEmulator(WeakCell<OrderEmulator>),
31}
32
33impl FillMarketOrderHandler for FillMarketOrderHandlerAny {
34    fn fill_market_order(&mut self, order: &OrderAny) {
35        match self {
36            Self::OrderMatchingEngine(engine_weak) => {
37                if let Some(engine) = engine_weak.upgrade() {
38                    engine.borrow_mut().fill_market_order(&mut order.clone());
39                }
40            }
41            Self::OrderEmulator(emulator_weak) => {
42                if let Some(emulator) = emulator_weak.upgrade() {
43                    emulator.borrow_mut().fill_market_order(&mut order.clone());
44                }
45            }
46        }
47    }
48}
49
50#[derive(Clone, Debug)]
51pub struct ShareableFillMarketOrderHandler(pub FillMarketOrderHandlerAny);
52
53pub trait FillLimitOrderHandler {
54    fn fill_limit_order(&mut self, order: &mut OrderAny);
55}
56
57#[derive(Clone, Debug)]
58pub enum FillLimitOrderHandlerAny {
59    OrderMatchingEngine(WeakCell<OrderMatchingEngine>),
60    OrderEmulator(WeakCell<OrderEmulator>),
61}
62
63impl FillLimitOrderHandler for FillLimitOrderHandlerAny {
64    fn fill_limit_order(&mut self, order: &mut OrderAny) {
65        match self {
66            Self::OrderMatchingEngine(engine_weak) => {
67                if let Some(engine) = engine_weak.upgrade() {
68                    engine.borrow_mut().fill_limit_order(order);
69                }
70            }
71            Self::OrderEmulator(emulator_weak) => {
72                if let Some(emulator) = emulator_weak.upgrade() {
73                    emulator.borrow_mut().fill_limit_order(order);
74                }
75            }
76        }
77    }
78}
79
80#[derive(Clone, Debug)]
81pub struct ShareableFillLimitOrderHandler(pub FillLimitOrderHandlerAny);
82
83pub trait TriggerStopOrderHandler {
84    fn trigger_stop_order(&mut self, order: &mut OrderAny);
85}
86
87#[derive(Clone, Debug)]
88pub enum TriggerStopOrderHandlerAny {
89    OrderMatchingEngine(WeakCell<OrderMatchingEngine>),
90    OrderEmulator(WeakCell<OrderEmulator>),
91}
92
93impl TriggerStopOrderHandler for TriggerStopOrderHandlerAny {
94    fn trigger_stop_order(&mut self, order: &mut OrderAny) {
95        match self {
96            Self::OrderMatchingEngine(engine_weak) => {
97                if let Some(engine) = engine_weak.upgrade() {
98                    engine.borrow_mut().trigger_stop_order(order);
99                }
100            }
101            Self::OrderEmulator(emulator_weak) => {
102                if let Some(emulator) = emulator_weak.upgrade() {
103                    emulator.borrow_mut().trigger_stop_order(order);
104                }
105            }
106        }
107    }
108}
109
110#[derive(Clone, Debug)]
111pub struct ShareableTriggerStopOrderHandler(pub TriggerStopOrderHandlerAny);