diff --git a/types/src/order.rs b/types/src/order.rs index 90d7329..9bf0a2e 100644 --- a/types/src/order.rs +++ b/types/src/order.rs @@ -213,6 +213,21 @@ pub enum OrderStatus { TriggerPending, } +#[derive( + Debug, Display, Clone, Copy, Serialize, Deserialize, Default, EnumString, PartialEq, Eq, Hash, +)] +#[strum(serialize_all = "PascalCase")] +#[serde(rename_all = "PascalCase")] +pub enum SystemOrderType { + #[default] + LiquidatePositionOnBook, + LiquidatePositionOnBackstop, + LiquidatePositionOnAdl, + CollateralConversion, + FutureExpiry, + OrderBookClosed, +} + #[derive( Debug, Display, Clone, Copy, Serialize, Deserialize, Default, EnumString, PartialEq, Eq, Hash, )] diff --git a/types/src/rfq.rs b/types/src/rfq.rs index 2d99a41..fbe12ed 100644 --- a/types/src/rfq.rs +++ b/types/src/rfq.rs @@ -2,7 +2,7 @@ use rust_decimal::Decimal; use serde::{Deserialize, Serialize}; use strum::{Display, EnumString}; -use crate::order::{OrderStatus, Side}; +use crate::order::{OrderStatus, Side, SystemOrderType}; #[derive( Debug, Display, Clone, Copy, Serialize, Deserialize, Default, EnumString, PartialEq, Eq, Hash, @@ -106,6 +106,8 @@ pub enum RequestForQuoteUpdate { order_status: OrderStatus, #[serde(rename = "T")] timestamp: i64, + #[serde(rename = "o", default)] + system_order_type: Option, }, RfqRefreshed { #[serde(rename = "E")] @@ -130,6 +132,8 @@ pub enum RequestForQuoteUpdate { order_status: OrderStatus, #[serde(rename = "T")] timestamp: i64, + #[serde(rename = "o", default)] + system_order_type: Option, }, RfqAccepted { #[serde(rename = "E")] @@ -154,6 +158,8 @@ pub enum RequestForQuoteUpdate { order_status: OrderStatus, #[serde(rename = "T")] timestamp: i64, + #[serde(rename = "o", default)] + system_order_type: Option, }, RfqCancelled { #[serde(rename = "E")] @@ -178,6 +184,8 @@ pub enum RequestForQuoteUpdate { order_status: OrderStatus, #[serde(rename = "T")] timestamp: i64, + #[serde(rename = "o", default)] + system_order_type: Option, }, QuoteAccepted { #[serde(rename = "E")] @@ -262,6 +270,8 @@ pub enum RequestForQuoteUpdate { order_status: OrderStatus, #[serde(rename = "T")] timestamp: i64, + #[serde(rename = "o", default)] + system_order_type: Option, }, } @@ -305,6 +315,8 @@ pub struct RequestForQuote { pub status: OrderStatus, pub execution_mode: RfqExecutionMode, pub created_at: i64, + #[serde(default)] + pub system_order_type: Option, } impl QuotePayload { @@ -346,3 +358,39 @@ impl QuotePayload { self } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn rfq_active_without_system_order_type() { + let data = r#"{"e":"rfqActive","E":1234567890,"R":123,"s":"BTC_USDC","q":"1.5","w":1234567890,"W":1234567899,"X":"New","T":1234567890}"#; + let update: RequestForQuoteUpdate = serde_json::from_str(data).unwrap(); + match update { + RequestForQuoteUpdate::RfqActive { + system_order_type, .. + } => { + assert!(system_order_type.is_none()); + } + _ => panic!("Expected RfqActive"), + } + } + + #[test] + fn rfq_active_with_system_order_type() { + let data = r#"{"e":"rfqActive","E":1234567890,"R":123,"s":"BTC_USDC","q":"1.5","w":1234567890,"W":1234567899,"X":"New","T":1234567890,"o":"CollateralConversion"}"#; + let update: RequestForQuoteUpdate = serde_json::from_str(data).unwrap(); + match update { + RequestForQuoteUpdate::RfqActive { + system_order_type, .. + } => { + assert_eq!( + system_order_type, + Some(SystemOrderType::CollateralConversion) + ); + } + _ => panic!("Expected RfqActive"), + } + } +}