nautilus_execution/order_emulator/
adapter.rs1use std::{
17 cell::{Ref, RefCell, RefMut},
18 rc::Rc,
19};
20
21use nautilus_common::{
22 cache::Cache,
23 clock::Clock,
24 msgbus::{MessageBus, handler::ShareableMessageHandler},
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(
45 clock: Rc<RefCell<dyn Clock>>,
46 cache: Rc<RefCell<Cache>>,
47 msgbus: Rc<RefCell<MessageBus>>,
48 ) -> Self {
49 let emulator = Rc::new(RefCell::new(OrderEmulator::new(
50 clock,
51 cache,
52 msgbus.clone(),
53 )));
54
55 Self::initialize_execute_handler(emulator.clone(), msgbus.clone());
56 Self::initialize_on_event_handler(emulator.clone(), msgbus);
57 Self::initialize_submit_order_handler(emulator.clone());
58 Self::initialize_cancel_order_handler(emulator.clone());
59 Self::initialize_modify_order_handler(emulator.clone());
60
61 Self { emulator }
62 }
63
64 fn initialize_submit_order_handler(emulator: Rc<RefCell<OrderEmulator>>) {
65 let handler = SubmitOrderHandlerAny::OrderEmulator(emulator.clone());
66 emulator.borrow_mut().set_submit_order_handler(handler);
67 }
68
69 fn initialize_cancel_order_handler(emulator: Rc<RefCell<OrderEmulator>>) {
70 let handler = CancelOrderHandlerAny::OrderEmulator(emulator.clone());
71 emulator.borrow_mut().set_cancel_order_handler(handler);
72 }
73
74 fn initialize_modify_order_handler(emulator: Rc<RefCell<OrderEmulator>>) {
75 let handler = ModifyOrderHandlerAny::OrderEmulator(emulator.clone());
76 emulator.borrow_mut().set_modify_order_handler(handler);
77 }
78
79 fn initialize_execute_handler(
80 emulator: Rc<RefCell<OrderEmulator>>,
81 msgbus: Rc<RefCell<MessageBus>>,
82 ) {
83 let handler = ShareableMessageHandler(Rc::new(OrderEmulatorExecuteHandler {
84 id: Ustr::from(&UUID4::new().to_string()),
85 emulator,
86 }));
87
88 msgbus
89 .borrow_mut()
90 .register("OrderEmulator.execute", handler);
91 }
92
93 fn initialize_on_event_handler(
94 emulator: Rc<RefCell<OrderEmulator>>,
95 msgbus: Rc<RefCell<MessageBus>>,
96 ) {
97 let handler = ShareableMessageHandler(Rc::new(OrderEmulatorOnEventHandler {
98 id: Ustr::from(&UUID4::new().to_string()),
99 emulator,
100 }));
101
102 msgbus
103 .borrow_mut()
104 .register("OrderEmulator.on_event", handler);
105 }
106
107 #[must_use]
108 pub fn get_emulator(&self) -> Ref<OrderEmulator> {
109 self.emulator.borrow()
110 }
111
112 #[must_use]
113 pub fn get_emulator_mut(&self) -> RefMut<OrderEmulator> {
114 self.emulator.borrow_mut()
115 }
116}