use crate::errors::PriceLevelError;
use serde::{Deserialize, Serialize};
use std::str::FromStr;
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum OrderStatus {
New,
Active,
PartiallyFilled,
Filled,
Canceled,
Rejected,
Expired,
}
impl OrderStatus {
#[allow(dead_code)]
#[must_use]
pub fn is_active(&self) -> bool {
matches!(self, Self::Active | Self::PartiallyFilled)
}
#[allow(dead_code)]
#[must_use]
pub fn is_terminated(&self) -> bool {
matches!(
self,
Self::Filled | Self::Canceled | Self::Rejected | Self::Expired
)
}
}
impl FromStr for OrderStatus {
type Err = PriceLevelError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_uppercase().as_str() {
"NEW" => Ok(OrderStatus::New),
"ACTIVE" => Ok(OrderStatus::Active),
"PARTIALLYFILLED" => Ok(OrderStatus::PartiallyFilled),
"FILLED" => Ok(OrderStatus::Filled),
"CANCELED" => Ok(OrderStatus::Canceled),
"REJECTED" => Ok(OrderStatus::Rejected),
"EXPIRED" => Ok(OrderStatus::Expired),
_ => Err(PriceLevelError::ParseError {
message: format!("Invalid OrderStatus: {s}"),
}),
}
}
}
impl std::fmt::Display for OrderStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
OrderStatus::New => write!(f, "NEW"),
OrderStatus::Active => write!(f, "ACTIVE"),
OrderStatus::PartiallyFilled => write!(f, "PARTIALLYFILLED"),
OrderStatus::Filled => write!(f, "FILLED"),
OrderStatus::Canceled => write!(f, "CANCELED"),
OrderStatus::Rejected => write!(f, "REJECTED"),
OrderStatus::Expired => write!(f, "EXPIRED"),
}
}
}