nautilus_execution/order_emulator/
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::{
22    cache::Cache,
23    clock::Clock,
24    msgbus::{handler::ShareableMessageHandler, register},
25};
26use nautilus_core::UUID4;
27use ustr::Ustr;
28
29use crate::order_emulator::{
30    emulator::OrderEmulator,
31    handlers::{OrderEmulatorExecuteHandler, OrderEmulatorOnEventHandler},
32};
33
34#[derive(Debug)]
35pub struct OrderEmulatorAdapter {
36    emulator: Rc<RefCell<OrderEmulator>>,
37}
38
39impl OrderEmulatorAdapter {
40    pub fn new(clock: Rc<RefCell<dyn Clock>>, cache: Rc<RefCell<Cache>>) -> Self {
41        let emulator = Rc::new(RefCell::new(OrderEmulator::new(clock, cache)));
42
43        Self::initialize_execute_handler(emulator.clone());
44        Self::initialize_on_event_handler(emulator.clone());
45        // Self::initialize_submit_order_handler(emulator.clone());
46        // Self::initialize_cancel_order_handler(emulator.clone());
47        // Self::initialize_modify_order_handler(emulator.clone());
48
49        Self { emulator }
50    }
51
52    // TODO: WIP: Revisit with actor framework
53    // fn initialize_submit_order_handler(emulator: Rc<RefCell<OrderEmulator>>) {
54    //     let handler = SubmitOrderHandlerAny::OrderEmulator(emulator.clone());
55    //     emulator.borrow_mut().set_submit_order_handler(handler);
56    // }
57    //
58    // fn initialize_cancel_order_handler(emulator: Rc<RefCell<OrderEmulator>>) {
59    //     let handler = CancelOrderHandlerAny::OrderEmulator(emulator.clone());
60    //     emulator.borrow_mut().set_cancel_order_handler(handler);
61    // }
62    //
63    // fn initialize_modify_order_handler(emulator: Rc<RefCell<OrderEmulator>>) {
64    //     let handler = ModifyOrderHandlerAny::OrderEmulator(emulator.clone());
65    //     emulator.borrow_mut().set_modify_order_handler(handler);
66    // }
67
68    fn initialize_execute_handler(emulator: Rc<RefCell<OrderEmulator>>) {
69        let handler = ShareableMessageHandler(Rc::new(OrderEmulatorExecuteHandler {
70            id: Ustr::from(&UUID4::new().to_string()),
71            emulator,
72        }));
73
74        register("OrderEmulator.execute".into(), handler);
75    }
76
77    fn initialize_on_event_handler(emulator: Rc<RefCell<OrderEmulator>>) {
78        let handler = ShareableMessageHandler(Rc::new(OrderEmulatorOnEventHandler {
79            id: Ustr::from(&UUID4::new().to_string()),
80            emulator,
81        }));
82
83        register("OrderEmulator.on_event".into(), handler);
84    }
85
86    #[must_use]
87    pub fn get_emulator(&self) -> Ref<OrderEmulator> {
88        self.emulator.borrow()
89    }
90
91    #[must_use]
92    pub fn get_emulator_mut(&self) -> RefMut<OrderEmulator> {
93        self.emulator.borrow_mut()
94    }
95}