nautilus_data/option_chains/
handlers.rs1use std::{cell::RefCell, rc::Rc};
19
20use nautilus_common::{msgbus::Handler, timer::TimeEvent};
21use nautilus_core::WeakCell;
22use nautilus_model::{
23 data::{QuoteTick, option_chain::OptionGreeks},
24 identifiers::OptionSeriesId,
25};
26use ustr::Ustr;
27
28use super::OptionChainManager;
29
30#[derive(Debug)]
34pub struct OptionChainQuoteHandler {
35 manager: WeakCell<OptionChainManager>,
36 id: Ustr,
37}
38
39impl OptionChainQuoteHandler {
40 pub fn new(manager: &Rc<RefCell<OptionChainManager>>, series_id: OptionSeriesId) -> Self {
41 let id = Ustr::from(&format!("OptionChainQuoteHandler({series_id})"));
42 Self {
43 manager: WeakCell::from(Rc::downgrade(manager)),
44 id,
45 }
46 }
47}
48
49impl Handler<QuoteTick> for OptionChainQuoteHandler {
50 fn id(&self) -> Ustr {
51 self.id
52 }
53
54 fn handle(&self, quote: &QuoteTick) {
55 if let Some(mgr) = self.manager.upgrade() {
56 mgr.borrow_mut().handle_quote(quote);
57 }
58 }
59}
60
61#[derive(Debug)]
63pub struct OptionChainGreeksHandler {
64 manager: WeakCell<OptionChainManager>,
65 id: Ustr,
66}
67
68impl OptionChainGreeksHandler {
69 pub fn new(manager: &Rc<RefCell<OptionChainManager>>, series_id: OptionSeriesId) -> Self {
70 let id = Ustr::from(&format!("OptionChainGreeksHandler({series_id})"));
71 Self {
72 manager: WeakCell::from(Rc::downgrade(manager)),
73 id,
74 }
75 }
76}
77
78impl Handler<OptionGreeks> for OptionChainGreeksHandler {
79 fn id(&self) -> Ustr {
80 self.id
81 }
82
83 fn handle(&self, greeks: &OptionGreeks) {
84 if let Some(mgr) = self.manager.upgrade() {
85 mgr.borrow_mut().handle_greeks(greeks);
86 }
87 }
88}
89
90#[derive(Debug)]
94pub struct OptionChainSlicePublisher {
95 manager: WeakCell<OptionChainManager>,
96}
97
98impl OptionChainSlicePublisher {
99 pub fn new(manager: &Rc<RefCell<OptionChainManager>>) -> Self {
100 Self {
101 manager: WeakCell::from(Rc::downgrade(manager)),
102 }
103 }
104
105 pub fn publish(&self, event: &TimeEvent) {
107 if let Some(mgr) = self.manager.upgrade() {
108 mgr.borrow_mut().publish_slice(event.ts_event);
109 }
110 }
111}