use std::{cell::RefCell, rc::Rc};
use nautilus_common::{msgbus::Handler, timer::TimeEvent};
use nautilus_core::WeakCell;
use nautilus_model::{
data::{QuoteTick, option_chain::OptionGreeks},
identifiers::OptionSeriesId,
};
use ustr::Ustr;
use super::OptionChainManager;
#[derive(Debug)]
pub struct OptionChainQuoteHandler {
manager: WeakCell<OptionChainManager>,
id: Ustr,
}
impl OptionChainQuoteHandler {
pub fn new(manager: &Rc<RefCell<OptionChainManager>>, series_id: OptionSeriesId) -> Self {
let id = Ustr::from(&format!("OptionChainQuoteHandler({series_id})"));
Self {
manager: WeakCell::from(Rc::downgrade(manager)),
id,
}
}
}
impl Handler<QuoteTick> for OptionChainQuoteHandler {
fn id(&self) -> Ustr {
self.id
}
fn handle(&self, quote: &QuoteTick) {
if let Some(mgr) = self.manager.upgrade() {
mgr.borrow_mut().handle_quote(quote);
}
}
}
#[derive(Debug)]
pub struct OptionChainGreeksHandler {
manager: WeakCell<OptionChainManager>,
id: Ustr,
}
impl OptionChainGreeksHandler {
pub fn new(manager: &Rc<RefCell<OptionChainManager>>, series_id: OptionSeriesId) -> Self {
let id = Ustr::from(&format!("OptionChainGreeksHandler({series_id})"));
Self {
manager: WeakCell::from(Rc::downgrade(manager)),
id,
}
}
}
impl Handler<OptionGreeks> for OptionChainGreeksHandler {
fn id(&self) -> Ustr {
self.id
}
fn handle(&self, greeks: &OptionGreeks) {
if let Some(mgr) = self.manager.upgrade() {
mgr.borrow_mut().handle_greeks(greeks);
}
}
}
#[derive(Debug)]
pub struct OptionChainSlicePublisher {
manager: WeakCell<OptionChainManager>,
}
impl OptionChainSlicePublisher {
pub fn new(manager: &Rc<RefCell<OptionChainManager>>) -> Self {
Self {
manager: WeakCell::from(Rc::downgrade(manager)),
}
}
pub fn publish(&self, event: &TimeEvent) {
if let Some(mgr) = self.manager.upgrade() {
mgr.borrow_mut().publish_slice(event.ts_event);
}
}
}