use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct RestingOrder {
pub oid: u64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FilledOrder {
pub total_sz: String,
pub avg_px: String,
pub oid: u64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum ExchangeDataStatus {
Success,
WaitingForFill,
WaitingForTrigger,
Error(String),
Resting(RestingOrder),
Filled(FilledOrder),
}
#[derive(Debug, Clone, Deserialize)]
pub struct ExchangeDataStatuses {
pub statuses: Vec<ExchangeDataStatus>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ExchangeResponse {
#[serde(rename = "type")]
pub response_type: String,
pub data: Option<ExchangeDataStatuses>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[serde(tag = "status", content = "response")]
pub enum ExchangeResponseStatus {
Ok(ExchangeResponse),
Err(String),
}
impl ExchangeResponseStatus {
pub fn is_ok(&self) -> bool {
matches!(self, Self::Ok(_))
}
pub fn error(&self) -> Option<&str> {
match self {
Self::Err(msg) => Some(msg),
_ => None,
}
}
pub fn into_result(self) -> Result<ExchangeResponse, String> {
match self {
Self::Ok(response) => Ok(response),
Self::Err(msg) => Err(msg),
}
}
}
impl ExchangeDataStatus {
pub fn is_success(&self) -> bool {
matches!(self, Self::Success | Self::Resting(_) | Self::Filled(_))
}
pub fn order_id(&self) -> Option<u64> {
match self {
Self::Resting(order) => Some(order.oid),
Self::Filled(order) => Some(order.oid),
_ => None,
}
}
}