architect_api/cpty/
cumberland.rs1use 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}