use fastnum::UD64;
use thiserror::Error;
use crate::types::{OrderId, OrderSide};
#[derive(Debug, Clone, PartialEq, Error)]
pub enum OrderBookError {
#[error("order #{order_id} already exists at price {existing_price}")]
OrderAlreadyExists { order_id: OrderId, existing_price: UD64 },
#[error("order #{order_id} not found in book")]
OrderNotFound { order_id: OrderId },
#[error("order #{order_id} not found at expected {side:?} level price {expected_price}")]
OrderNotAtExpectedLevel { order_id: OrderId, expected_price: UD64, side: OrderSide },
#[error("order ID mismatch: expected {expected}, got {actual}")]
OrderIdMismatch { expected: OrderId, actual: OrderId },
#[error("order #{order_id} has invalid size: {size}")]
InvalidOrderSize { order_id: OrderId, size: UD64 },
#[error("order #{order_id} has invalid price: {price}")]
InvalidOrderPrice { order_id: OrderId, price: UD64 },
#[error("level not found at price {price} ({side:?} side)")]
LevelNotFound { price: UD64, side: OrderSide },
#[error(
"order #{order_id} has dangling {pointer} reference to non-existent order #{referenced_id}"
)]
DanglingOrderReference { order_id: OrderId, referenced_id: OrderId, pointer: &'static str },
}
pub type OrderBookResult<T> = Result<T, OrderBookError>;