use pricelevel::{PriceLevelError, Side};
use std::fmt;
#[derive(Debug)]
pub enum OrderBookError {
PriceLevelError(PriceLevelError),
OrderNotFound(String),
InvalidPriceLevel(u64),
PriceCrossing {
price: u64,
side: Side,
opposite_price: u64,
},
InsufficientLiquidity {
side: Side,
requested: u64,
available: u64,
},
InvalidOperation {
message: String,
},
}
impl fmt::Display for OrderBookError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
OrderBookError::PriceLevelError(err) => write!(f, "Price level error: {}", err),
OrderBookError::OrderNotFound(id) => write!(f, "Order not found: {}", id),
OrderBookError::InvalidPriceLevel(price) => write!(f, "Invalid price level: {}", price),
OrderBookError::PriceCrossing {
price,
side,
opposite_price,
} => {
write!(
f,
"Price crossing: {} {} would cross opposite at {}",
side, price, opposite_price
)
}
OrderBookError::InsufficientLiquidity {
side,
requested,
available,
} => {
write!(
f,
"Insufficient liquidity for {} order: requested {}, available {}",
side, requested, available
)
}
OrderBookError::InvalidOperation { message } => {
write!(f, "Invalid operation: {}", message)
}
}
}
}
impl std::error::Error for OrderBookError {}
impl From<PriceLevelError> for OrderBookError {
fn from(err: PriceLevelError) -> Self {
OrderBookError::PriceLevelError(err)
}
}