use ahash::AHashMap;
use nautilus_model::{
defi::{Pool, PoolProfiler},
identifiers::{InstrumentId, Venue},
};
use crate::cache::Cache;
#[derive(Clone, Debug, Default)]
pub(crate) struct DefiCache {
pub(crate) pools: AHashMap<InstrumentId, Pool>,
pub(crate) pool_profilers: AHashMap<InstrumentId, PoolProfiler>,
}
impl Cache {
pub fn add_pool(&mut self, pool: Pool) -> anyhow::Result<()> {
log::debug!("Adding `Pool` {}", pool.instrument_id);
self.defi.pools.insert(pool.instrument_id, pool);
Ok(())
}
pub fn add_pool_profiler(&mut self, pool_profiler: PoolProfiler) -> anyhow::Result<()> {
let instrument_id = pool_profiler.pool.instrument_id;
log::debug!("Adding `PoolProfiler` {instrument_id}");
self.defi
.pool_profilers
.insert(instrument_id, pool_profiler);
Ok(())
}
#[must_use]
pub fn pool(&self, instrument_id: &InstrumentId) -> Option<&Pool> {
self.defi.pools.get(instrument_id)
}
#[must_use]
pub fn pool_mut(&mut self, instrument_id: &InstrumentId) -> Option<&mut Pool> {
self.defi.pools.get_mut(instrument_id)
}
#[must_use]
pub fn pool_ids(&self, venue: Option<&Venue>) -> Vec<InstrumentId> {
match venue {
Some(v) => self
.defi
.pools
.keys()
.filter(|id| &id.venue == v)
.copied()
.collect(),
None => self.defi.pools.keys().copied().collect(),
}
}
#[must_use]
pub fn pools(&self, venue: Option<&Venue>) -> Vec<&Pool> {
match venue {
Some(v) => self
.defi
.pools
.values()
.filter(|p| &p.instrument_id.venue == v)
.collect(),
None => self.defi.pools.values().collect(),
}
}
#[must_use]
pub fn pool_profiler(&self, instrument_id: &InstrumentId) -> Option<&PoolProfiler> {
self.defi.pool_profilers.get(instrument_id)
}
#[must_use]
pub fn pool_profiler_mut(&mut self, instrument_id: &InstrumentId) -> Option<&mut PoolProfiler> {
self.defi.pool_profilers.get_mut(instrument_id)
}
#[must_use]
pub fn pool_profiler_ids(&self, venue: Option<&Venue>) -> Vec<InstrumentId> {
match venue {
Some(v) => self
.defi
.pool_profilers
.keys()
.filter(|id| &id.venue == v)
.copied()
.collect(),
None => self.defi.pool_profilers.keys().copied().collect(),
}
}
#[must_use]
pub fn pool_profilers(&self, venue: Option<&Venue>) -> Vec<&PoolProfiler> {
match venue {
Some(v) => self
.defi
.pool_profilers
.values()
.filter(|p| &p.pool.instrument_id.venue == v)
.collect(),
None => self.defi.pool_profilers.values().collect(),
}
}
}