architect_api/cpty/
b2c2.rs

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