use crate::errors::PriceLevelError;
use crate::orders::{Id, OrderType};
use crossbeam::queue::SegQueue;
use dashmap::DashMap;
use serde::de::{SeqAccess, Visitor};
use serde::ser::SerializeSeq;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::fmt;
use std::fmt::Display;
use std::marker::PhantomData;
use std::str::FromStr;
use std::sync::Arc;
#[derive(Debug)]
pub struct OrderQueue {
orders: DashMap<Id, Arc<OrderType<()>>>,
order_ids: SegQueue<Id>,
}
impl OrderQueue {
#[must_use]
pub fn new() -> Self {
Self {
orders: DashMap::new(),
order_ids: SegQueue::new(),
}
}
pub fn push(&self, order: Arc<OrderType<()>>) {
let order_id = order.id();
self.orders.insert(order_id, order);
self.order_ids.push(order_id);
}
#[must_use]
pub fn pop(&self) -> Option<Arc<OrderType<()>>> {
loop {
if let Some(order_id) = self.order_ids.pop() {
if let Some((_, order)) = self.orders.remove(&order_id) {
return Some(order);
}
} else {
return None; }
}
}
#[must_use]
pub fn find(&self, order_id: Id) -> Option<Arc<OrderType<()>>> {
self.orders.get(&order_id).map(|o| o.value().clone())
}
#[must_use]
pub fn remove(&self, order_id: Id) -> Option<Arc<OrderType<()>>> {
self.orders.remove(&order_id).map(|(_, order)| order)
}
pub fn iter_orders(&self) -> impl Iterator<Item = Arc<OrderType<()>>> + '_ {
self.orders.iter().map(|entry| entry.value().clone())
}
#[must_use]
pub fn snapshot_vec(&self) -> Vec<Arc<OrderType<()>>> {
let mut orders: Vec<Arc<OrderType<()>>> =
self.orders.iter().map(|o| o.value().clone()).collect();
orders.sort_by_key(|o| o.timestamp());
orders
}
#[must_use]
pub fn to_vec(&self) -> Vec<Arc<OrderType<()>>> {
self.snapshot_vec()
}
#[allow(dead_code)]
#[must_use]
pub fn from_vec(orders: Vec<Arc<OrderType<()>>>) -> Self {
let queue = OrderQueue::new();
for order in orders {
queue.push(order);
}
queue
}
#[allow(dead_code)]
#[must_use]
pub fn is_empty(&self) -> bool {
self.orders.is_empty()
}
#[must_use]
pub fn len(&self) -> usize {
self.orders.len()
}
}
impl Default for OrderQueue {
fn default() -> Self {
Self::new()
}
}
impl Serialize for OrderQueue {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut seq = serializer.serialize_seq(Some(self.len()))?;
for order_entry in self.orders.iter() {
seq.serialize_element(order_entry.value().as_ref())?;
}
seq.end()
}
}
impl FromStr for OrderQueue {
type Err = PriceLevelError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if !s.starts_with("OrderQueue:orders=[") || !s.ends_with(']') {
return Err(PriceLevelError::ParseError {
message: "Invalid format".to_string(),
});
}
let content = &s["OrderQueue:orders=[".len()..s.len() - 1];
let queue = OrderQueue::new();
if !content.is_empty() {
for order_str in content.split(',') {
let order =
OrderType::from_str(order_str).map_err(|e| PriceLevelError::ParseError {
message: format!("Order parse error: {e}"),
})?;
queue.push(Arc::new(order));
}
}
Ok(queue)
}
}
impl Display for OrderQueue {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "OrderQueue:orders=[")?;
let mut first = true;
for order in self.snapshot_vec() {
if !first {
write!(f, ",")?;
}
write!(f, "{order}")?;
first = false;
}
write!(f, "]")
}
}
impl From<Vec<Arc<OrderType<()>>>> for OrderQueue {
fn from(orders: Vec<Arc<OrderType<()>>>) -> Self {
let queue = OrderQueue::new();
for order in orders {
queue.push(order);
}
queue
}
}
struct OrderQueueVisitor {
marker: PhantomData<fn() -> OrderQueue>,
}
impl OrderQueueVisitor {
fn new() -> Self {
OrderQueueVisitor {
marker: PhantomData,
}
}
}
impl<'de> Visitor<'de> for OrderQueueVisitor {
type Value = OrderQueue;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a sequence of orders")
}
fn visit_seq<V>(self, mut seq: V) -> Result<OrderQueue, V::Error>
where
V: SeqAccess<'de>,
{
let queue = OrderQueue::new();
while let Some(order) = seq.next_element::<OrderType<()>>()? {
queue.push(Arc::new(order));
}
Ok(queue)
}
}
impl<'de> Deserialize<'de> for OrderQueue {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_seq(OrderQueueVisitor::new())
}
}