use getset::{CopyGetters, Getters, Setters};
use crate::{
prelude::{MarketUpdate, PriceFilter},
quote,
types::{Currency, QuoteCurrency, Result, TimestampNs},
};
#[derive(Debug, Default, Clone, Getters, CopyGetters, Setters)]
pub struct MarketState {
#[getset(get_copy = "pub", set = "pub(crate)")]
bid: QuoteCurrency,
#[getset(get_copy = "pub", set = "pub(crate)")]
ask: QuoteCurrency,
#[getset(get_copy = "pub")]
current_ts_ns: TimestampNs,
#[getset(get_copy = "pub")]
step: u64,
}
impl MarketState {
pub(crate) fn update_state<U, Q, UserOrderId>(
&mut self,
timestamp_ns: TimestampNs,
market_update: &U,
price_filter: &PriceFilter,
) -> Result<()>
where
U: MarketUpdate<Q, UserOrderId>,
Q: Currency,
UserOrderId: Clone,
{
market_update.validate_market_update(price_filter)?;
market_update.update_market_state(self);
self.current_ts_ns = timestamp_ns;
self.step += 1;
Ok(())
}
#[inline]
pub fn mid_price(&self) -> QuoteCurrency {
(self.bid + self.ask) / quote!(2)
}
#[inline]
pub fn current_timestamp_ns(&self) -> TimestampNs {
self.current_ts_ns
}
#[cfg(test)]
pub fn from_components(
bid: QuoteCurrency,
ask: QuoteCurrency,
current_ts_ns: TimestampNs,
step: u64,
) -> Self {
Self {
bid,
ask,
current_ts_ns,
step,
}
}
}