use std::sync::{Arc, Mutex};
use ahash::AHashSet;
use nautilus_common::cache::fifo::FifoCacheMap;
use nautilus_core::MUTEX_POISONED;
use nautilus_model::identifiers::{ClientOrderId, VenueOrderId};
#[derive(Clone, Debug, Default)]
pub(crate) struct PendingSubmitTracker {
venue_to_client: Arc<Mutex<FifoCacheMap<VenueOrderId, ClientOrderId, 10_000>>>,
}
impl PendingSubmitTracker {
pub(crate) fn insert(&self, venue_order_id: VenueOrderId, client_order_id: ClientOrderId) {
self.venue_to_client
.lock()
.expect(MUTEX_POISONED)
.insert(venue_order_id, client_order_id);
}
pub(crate) fn client_order_id(&self, venue_order_id: &VenueOrderId) -> Option<ClientOrderId> {
self.venue_to_client
.lock()
.expect(MUTEX_POISONED)
.get(venue_order_id)
.copied()
}
}
#[derive(Clone, Debug, Default)]
pub(crate) struct PendingCancelTracker {
client_order_ids: Arc<Mutex<AHashSet<ClientOrderId>>>,
}
impl PendingCancelTracker {
pub(crate) fn insert(&self, client_order_id: ClientOrderId) {
self.client_order_ids
.lock()
.expect(MUTEX_POISONED)
.insert(client_order_id);
}
pub(crate) fn remove(&self, client_order_id: &ClientOrderId) -> bool {
self.client_order_ids
.lock()
.expect(MUTEX_POISONED)
.remove(client_order_id)
}
pub(crate) fn contains(&self, client_order_id: &ClientOrderId) -> bool {
self.client_order_ids
.lock()
.expect(MUTEX_POISONED)
.contains(client_order_id)
}
}