architect_api/cpty/
cumberland.rs

1use crate::{
2    folio::FolioMessage,
3    orderflow::{Fill, Order, OrderflowMessage, Out, Reject},
4    symbology::market::NormalizedMarketInfo,
5};
6#[cfg(feature = "netidx")]
7use derive::FromValue;
8use log::error;
9#[cfg(feature = "netidx")]
10use netidx_derive::Pack;
11use rust_decimal::Decimal;
12use schemars::JsonSchema;
13use serde_derive::{Deserialize, Serialize};
14
15#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
16#[cfg_attr(feature = "netidx", derive(Pack))]
17#[cfg_attr(feature = "netidx", derive(FromValue))]
18pub enum CumberlandMessage {
19    Order(Order),
20    Reject(Reject),
21    Fill(Fill),
22    Out(Out),
23    ExchangeFill(Fill),
24    ExchangeReject(Reject),
25    Folio(FolioMessage),
26}
27
28impl TryInto<OrderflowMessage> for &CumberlandMessage {
29    type Error = ();
30
31    fn try_into(self) -> Result<OrderflowMessage, Self::Error> {
32        match self {
33            CumberlandMessage::Order(o) => Ok(OrderflowMessage::Order(*o)),
34            CumberlandMessage::Reject(r) => Ok(OrderflowMessage::Reject(r.clone())),
35            CumberlandMessage::Fill(f) => Ok(OrderflowMessage::Fill(Ok(*f))),
36            CumberlandMessage::Out(o) => Ok(OrderflowMessage::Out(*o)),
37            CumberlandMessage::ExchangeFill(..) => Err(()),
38            CumberlandMessage::ExchangeReject(..) => Err(()),
39            CumberlandMessage::Folio(..) => Err(()),
40        }
41    }
42}
43
44impl TryInto<CumberlandMessage> for &OrderflowMessage {
45    type Error = ();
46
47    fn try_into(self) -> Result<CumberlandMessage, Self::Error> {
48        match self {
49            OrderflowMessage::Order(o) => Ok(CumberlandMessage::Order(*o)),
50            OrderflowMessage::Cancel(_) => Err(()),
51            OrderflowMessage::Reject(r) => Ok(CumberlandMessage::Reject(r.clone())),
52            OrderflowMessage::Ack(_) => Err(()),
53            OrderflowMessage::Fill(f) => Ok(CumberlandMessage::Fill(f.map_err(|_| ())?)),
54            OrderflowMessage::Out(o) => Ok(CumberlandMessage::Out(*o)),
55            OrderflowMessage::CancelAll(_) => {
56                Err(error!("Cancel all not implemented for Cumberland"))
57            }
58        }
59    }
60}
61
62impl TryInto<FolioMessage> for &CumberlandMessage {
63    type Error = ();
64
65    fn try_into(self) -> Result<FolioMessage, Self::Error> {
66        match self {
67            CumberlandMessage::Folio(f) => Ok(f.clone()),
68            _ => Err(()),
69        }
70    }
71}
72
73impl TryInto<CumberlandMessage> for &FolioMessage {
74    type Error = ();
75
76    fn try_into(self) -> Result<CumberlandMessage, Self::Error> {
77        Ok(CumberlandMessage::Folio(self.clone()))
78    }
79}
80
81#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
82#[cfg_attr(feature = "netidx", derive(Pack))]
83pub struct CumberlandMarketInfo {
84    pub tick_size: Decimal,
85    pub step_size: Decimal,
86    pub is_delisted: bool,
87}
88
89impl NormalizedMarketInfo for CumberlandMarketInfo {
90    fn tick_size(&self) -> Decimal {
91        self.tick_size
92    }
93
94    fn step_size(&self) -> Decimal {
95        self.step_size
96    }
97
98    fn is_delisted(&self) -> bool {
99        self.is_delisted
100    }
101}
102
103impl std::fmt::Display for CumberlandMarketInfo {
104    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
105        write!(f, "{}", serde_json::to_string_pretty(self).unwrap())?;
106        Ok(())
107    }
108}