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