use serde::{Deserialize};
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
#[repr(u8)]
pub enum OrderStatus {
Pending,
Placed,
Resting,
Working,
Modified,
Filled,
PartiallyFilled,
Cancelled,
CancelledRiskLimit,
CancelledSelfCrossing,
CancelledReduceOnly,
CancelledIOC,
RejectedInvalid,
RejectedRiskLimit,
RejectedCrossing,
RejectedDuplicate,
Triggered,
SiblingCancelled,
TriggerFailed,
}
#[allow(unused)]
impl OrderStatus {
pub fn is_terminal(&self) -> bool {
match self {
OrderStatus::Pending => false,
OrderStatus::Placed => false,
OrderStatus::Resting => false,
OrderStatus::Working => false,
OrderStatus::Modified => true,
OrderStatus::Filled => true,
OrderStatus::PartiallyFilled => true,
OrderStatus::Cancelled => true,
OrderStatus::CancelledRiskLimit => true,
OrderStatus::CancelledSelfCrossing => true,
OrderStatus::CancelledReduceOnly => true,
OrderStatus::CancelledIOC => true,
OrderStatus::RejectedInvalid => true,
OrderStatus::RejectedRiskLimit => true,
OrderStatus::RejectedCrossing => true,
OrderStatus::RejectedDuplicate => true,
OrderStatus::Triggered => true,
OrderStatus::SiblingCancelled => true,
OrderStatus::TriggerFailed => true,
}
}
pub fn is_rejected(&self) -> bool {
match self {
OrderStatus::RejectedInvalid => true,
OrderStatus::RejectedRiskLimit => true,
OrderStatus::RejectedCrossing => true,
OrderStatus::RejectedDuplicate => true,
_ => false,
}
}
}
impl TryFrom<&str> for OrderStatus {
type Error = String;
fn try_from(status: &str) -> Result<Self, Self::Error> {
match status {
"pending" => Ok(OrderStatus::Pending),
"placed" => Ok(OrderStatus::Placed),
"resting" => Ok(OrderStatus::Resting),
"working" => Ok(OrderStatus::Working),
"modified" => Ok(OrderStatus::Modified),
"filled" => Ok(OrderStatus::Filled),
"partiallyFilled" => Ok(OrderStatus::PartiallyFilled),
"cancelled" => Ok(OrderStatus::Cancelled),
"canceled" => Ok(OrderStatus::Cancelled),
"canceledRiskLimit" => Ok(OrderStatus::CancelledRiskLimit),
"cancelledRiskLimit" => Ok(OrderStatus::CancelledRiskLimit),
"canceledSelfCrossing" => Ok(OrderStatus::CancelledSelfCrossing),
"cancelledSelfCrossing" => Ok(OrderStatus::CancelledSelfCrossing),
"canceledReduceOnly" => Ok(OrderStatus::CancelledReduceOnly),
"cancelledReduceOnly" => Ok(OrderStatus::CancelledReduceOnly),
"canceledIOC" => Ok(OrderStatus::CancelledIOC),
"cancelledIOC" => Ok(OrderStatus::CancelledIOC),
"rejectedInvalid" => Ok(OrderStatus::RejectedInvalid),
"rejectedRiskLimit" => Ok(OrderStatus::RejectedRiskLimit),
"rejectedCrossing" => Ok(OrderStatus::RejectedCrossing),
"rejectedDuplicate" => Ok(OrderStatus::RejectedDuplicate),
"triggered" => Ok(OrderStatus::Triggered),
"siblingCancelled" => Ok(OrderStatus::SiblingCancelled),
"triggerFailed" => Ok(OrderStatus::TriggerFailed),
_ => Err(format!("Unknown OrderStatus: {}", status)),
}
}
}
impl TryFrom<String> for OrderStatus {
type Error = String;
fn try_from(status: String) -> Result<Self, Self::Error> {
Self::try_from(status.as_str())
}
}
impl<'de> Deserialize<'de> for OrderStatus {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
OrderStatus::try_from(s).map_err(serde::de::Error::custom)
}
}