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}