architect_api/cpty/
falconx.rs

1use 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}