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