architect_api/cpty/
falconx.rs1use crate::{folio::FolioMessage, orderflow::*, symbology::market::NormalizedMarketInfo};
2#[cfg(feature = "netidx")]
3use derive::FromValue;
4use log::error;
5#[cfg(feature = "netidx")]
6use netidx_derive::Pack;
7use rust_decimal::Decimal;
8use rust_decimal_macros::dec;
9use schemars::JsonSchema;
10use serde::{Deserialize, Serialize};
11use std::ops::{Deref, DerefMut};
12
13#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
14#[cfg_attr(feature = "netidx", derive(Pack))]
15pub struct FalconXMarketInfo {}
16
17impl NormalizedMarketInfo for FalconXMarketInfo {
18 fn tick_size(&self) -> Decimal {
19 dec!(0.0001)
20 }
21
22 fn step_size(&self) -> Decimal {
23 dec!(0.000001)
24 }
25
26 fn is_delisted(&self) -> bool {
27 false
28 }
29}
30
31impl std::fmt::Display for FalconXMarketInfo {
32 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33 write!(f, "{}", serde_json::to_string_pretty(self).unwrap())?;
34 Ok(())
35 }
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
39#[cfg_attr(feature = "netidx", derive(Pack))]
40#[cfg_attr(feature = "netidx", derive(FromValue))]
41pub enum FalconXMessage {
42 Order(FalconXOrder),
43 Reject(Reject),
44 Fill(FalconXFill),
45 Out(Out),
46 Folio(FolioMessage),
47 ExchangeExternalFills(Vec<FalconXFill>),
48}
49
50impl TryInto<FalconXMessage> for &OrderflowMessage {
51 type Error = ();
52
53 fn try_into(self) -> Result<FalconXMessage, ()> {
54 match self {
55 OrderflowMessage::Order(o) => {
56 Ok(FalconXMessage::Order(FalconXOrder { order: *o }))
57 }
58 OrderflowMessage::Cancel(_) => Err(()),
59 OrderflowMessage::Reject(r) => Ok(FalconXMessage::Reject(r.clone())),
60 OrderflowMessage::Ack(_) => Err(()),
61 OrderflowMessage::Fill(f) => {
62 Ok(FalconXMessage::Fill(FalconXFill { fill: *f }))
63 }
64 OrderflowMessage::Out(o) => Ok(FalconXMessage::Out(*o)),
65 OrderflowMessage::CancelAll(_) => {
66 Err(error!("Cancel all not implemented for FalconX"))
67 }
68 }
69 }
70}
71
72impl TryInto<OrderflowMessage> for &FalconXMessage {
73 type Error = ();
74
75 fn try_into(self) -> Result<OrderflowMessage, ()> {
76 match self {
77 FalconXMessage::Order(o) => Ok(OrderflowMessage::Order(**o)),
78 FalconXMessage::Reject(r) => Ok(OrderflowMessage::Reject(r.clone())),
79 FalconXMessage::Fill(f) => Ok(OrderflowMessage::Fill(**f)),
80 FalconXMessage::Out(o) => Ok(OrderflowMessage::Out(*o)),
81 FalconXMessage::Folio(_) => Err(()),
82 FalconXMessage::ExchangeExternalFills(..) => Err(()),
83 }
84 }
85}
86
87impl TryInto<FolioMessage> for &FalconXMessage {
88 type Error = ();
89
90 fn try_into(self) -> Result<FolioMessage, ()> {
91 match self {
92 FalconXMessage::Folio(f) => Ok(f.clone()),
93 _ => Err(()),
94 }
95 }
96}
97
98impl TryFrom<&FolioMessage> for FalconXMessage {
99 type Error = ();
100
101 fn try_from(f: &FolioMessage) -> Result<Self, ()> {
102 Ok(Self::Folio(f.clone()))
103 }
104}
105
106#[derive(Debug, Clone, Copy, Serialize, Deserialize, JsonSchema)]
107#[cfg_attr(feature = "netidx", derive(Pack))]
108pub struct FalconXOrder {
109 #[serde(flatten)]
110 pub order: Order,
111}
112
113impl From<Order> for FalconXOrder {
114 fn from(order: Order) -> Self {
115 Self { order }
116 }
117}
118
119impl Deref for FalconXOrder {
120 type Target = Order;
121
122 fn deref(&self) -> &Self::Target {
123 &self.order
124 }
125}
126
127impl DerefMut for FalconXOrder {
128 fn deref_mut(&mut self) -> &mut Self::Target {
129 &mut self.order
130 }
131}
132
133#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
134#[cfg_attr(feature = "netidx", derive(Pack))]
135pub struct FalconXFill {
136 #[serde(flatten)]
137 pub fill: Result<Fill, AberrantFill>,
138}
139
140impl Deref for FalconXFill {
141 type Target = Result<Fill, AberrantFill>;
142
143 fn deref(&self) -> &Self::Target {
144 &self.fill
145 }
146}