nautilus_data/engine/
handlers.rs1use std::{any::Any, cell::RefCell, rc::Rc};
17
18use nautilus_common::msgbus::handler::MessageHandler;
19use nautilus_model::data::{Bar, BarType, QuoteTick, TradeTick};
20use ustr::Ustr;
21
22use crate::aggregation::BarAggregator;
23
24#[derive(Debug)]
30pub struct BarQuoteHandler {
31 aggregator: Rc<RefCell<Box<dyn BarAggregator>>>,
32 bar_type: BarType,
33}
34
35impl BarQuoteHandler {
36 pub(crate) fn new(aggregator: Rc<RefCell<Box<dyn BarAggregator>>>, bar_type: BarType) -> Self {
37 Self {
38 aggregator,
39 bar_type,
40 }
41 }
42}
43
44impl MessageHandler for BarQuoteHandler {
45 fn id(&self) -> Ustr {
46 Ustr::from(&format!("BarQuoteHandler|{}", self.bar_type))
47 }
48
49 fn handle(&self, msg: &dyn Any) {
50 if let Some(quote) = msg.downcast_ref::<QuoteTick>() {
51 self.aggregator.borrow_mut().handle_quote(*quote);
52 }
53 }
54
55 fn as_any(&self) -> &dyn Any {
56 self
57 }
58}
59
60#[derive(Debug)]
66pub struct BarTradeHandler {
67 aggregator: Rc<RefCell<Box<dyn BarAggregator>>>,
68 bar_type: BarType,
69}
70
71impl BarTradeHandler {
72 pub(crate) fn new(aggregator: Rc<RefCell<Box<dyn BarAggregator>>>, bar_type: BarType) -> Self {
73 Self {
74 aggregator,
75 bar_type,
76 }
77 }
78}
79
80impl MessageHandler for BarTradeHandler {
81 fn id(&self) -> Ustr {
82 Ustr::from(&format!("BarTradeHandler|{}", self.bar_type))
83 }
84
85 fn handle(&self, msg: &dyn Any) {
86 if let Some(trade) = msg.downcast_ref::<TradeTick>() {
87 self.aggregator.borrow_mut().handle_trade(*trade);
88 }
89 }
90
91 fn as_any(&self) -> &dyn Any {
92 self
93 }
94}
95
96#[derive(Debug)]
103pub struct BarBarHandler {
104 aggregator: Rc<RefCell<Box<dyn BarAggregator>>>,
105 bar_type: BarType,
106}
107
108impl BarBarHandler {
109 pub(crate) fn new(aggregator: Rc<RefCell<Box<dyn BarAggregator>>>, bar_type: BarType) -> Self {
110 Self {
111 aggregator,
112 bar_type,
113 }
114 }
115}
116
117impl MessageHandler for BarBarHandler {
118 fn id(&self) -> Ustr {
119 Ustr::from(&format!("BarBarHandler|{}", self.bar_type))
120 }
121
122 fn handle(&self, msg: &dyn Any) {
123 if let Some(bar) = msg.downcast_ref::<Bar>() {
124 self.aggregator.borrow_mut().handle_bar(*bar);
125 }
126 }
127
128 fn as_any(&self) -> &dyn Any {
129 self
130 }
131}