nautilus_execution/matching_engine/
adapter.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2025 Posei Systems Pty Ltd. All rights reserved.
3//  https://poseitrader.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::{
17    cell::{Ref, RefCell, RefMut},
18    rc::Rc,
19};
20
21use nautilus_common::{cache::Cache, clock::Clock};
22use nautilus_model::{
23    enums::{AccountType, BookType, OmsType},
24    instruments::InstrumentAny,
25};
26
27use crate::{
28    matching_core::handlers::{
29        FillLimitOrderHandlerAny, FillMarketOrderHandlerAny, ShareableFillLimitOrderHandler,
30        ShareableFillMarketOrderHandler, ShareableTriggerStopOrderHandler,
31        TriggerStopOrderHandlerAny,
32    },
33    matching_engine::{config::OrderMatchingEngineConfig, engine::OrderMatchingEngine},
34    models::{fee::FeeModelAny, fill::FillModel},
35};
36
37#[derive(Debug)]
38pub struct OrderEngineAdapter {
39    engine: Rc<RefCell<OrderMatchingEngine>>,
40}
41
42impl OrderEngineAdapter {
43    #[allow(clippy::too_many_arguments)]
44    pub fn new(
45        instrument: InstrumentAny,
46        raw_id: u32,
47        fill_model: FillModel,
48        fee_model: FeeModelAny,
49        book_type: BookType,
50        oms_type: OmsType,
51        account_type: AccountType,
52        clock: Rc<RefCell<dyn Clock>>,
53        cache: Rc<RefCell<Cache>>,
54        config: OrderMatchingEngineConfig,
55    ) -> Self {
56        let engine = Rc::new(RefCell::new(OrderMatchingEngine::new(
57            instrument,
58            raw_id,
59            fill_model,
60            fee_model,
61            book_type,
62            oms_type,
63            account_type,
64            clock,
65            cache,
66            config,
67        )));
68
69        Self::initialize_fill_order_handler(engine.clone());
70        Self::initialize_fill_market_order_handler(engine.clone());
71        Self::initialize_trigger_stop_order_handler(engine.clone());
72
73        Self { engine }
74    }
75
76    fn initialize_fill_order_handler(engine: Rc<RefCell<OrderMatchingEngine>>) {
77        let handler = ShareableFillLimitOrderHandler(
78            FillLimitOrderHandlerAny::OrderMatchingEngine(engine.clone()),
79        );
80        engine
81            .borrow_mut()
82            .core
83            .set_fill_limit_order_handler(handler);
84    }
85
86    fn initialize_fill_market_order_handler(engine: Rc<RefCell<OrderMatchingEngine>>) {
87        let handler = ShareableFillMarketOrderHandler(
88            FillMarketOrderHandlerAny::OrderMatchingEngine(engine.clone()),
89        );
90        engine
91            .borrow_mut()
92            .core
93            .set_fill_market_order_handler(handler);
94    }
95
96    fn initialize_trigger_stop_order_handler(engine: Rc<RefCell<OrderMatchingEngine>>) {
97        let handler = ShareableTriggerStopOrderHandler(
98            TriggerStopOrderHandlerAny::OrderMatchingEngine(engine.clone()),
99        );
100        engine
101            .borrow_mut()
102            .core
103            .set_trigger_stop_order_handler(handler);
104    }
105
106    #[must_use]
107    pub fn get_engine(&self) -> Ref<OrderMatchingEngine> {
108        self.engine.borrow()
109    }
110
111    #[must_use]
112    pub fn get_engine_mut(&self) -> RefMut<OrderMatchingEngine> {
113        self.engine.borrow_mut()
114    }
115}