architect_api/cpty/
galaxy.rs

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