1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
use crate::{folio::FolioMessage, orderflow::*, symbology::market::NormalizedMarketInfo};
use derive::FromValue;
use netidx_derive::Pack;
use rust_decimal::Decimal;
use rust_decimal_macros::dec;
use serde::{Deserialize, Serialize};
use std::ops::{Deref, DerefMut};

#[derive(Debug, Clone, Serialize, Deserialize, Pack)]
pub struct FalconXMarketInfo {}

impl NormalizedMarketInfo for FalconXMarketInfo {
    fn tick_size(&self) -> Decimal {
        dec!(0.0001)
    }

    fn step_size(&self) -> Decimal {
        dec!(0.000001)
    }

    fn is_delisted(&self) -> bool {
        false
    }
}

impl std::fmt::Display for FalconXMarketInfo {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", serde_json::to_string_pretty(self).unwrap())?;
        Ok(())
    }
}

#[derive(Debug, Clone, Pack, FromValue, Serialize, Deserialize)]
pub enum FalconXMessage {
    Order(FalconXOrder),
    Reject(Reject),
    Fill(FalconXFill),
    Out(Out),
    Folio(FolioMessage),
    ExchangeExternalFills(Vec<FalconXFill>),
}

impl TryInto<FalconXMessage> for &OrderflowMessage {
    type Error = ();

    fn try_into(self) -> Result<FalconXMessage, ()> {
        match self {
            OrderflowMessage::Order(o) => {
                Ok(FalconXMessage::Order(FalconXOrder { order: *o }))
            }
            OrderflowMessage::Cancel(_) => Err(()),
            OrderflowMessage::Reject(r) => Ok(FalconXMessage::Reject(r.clone())),
            OrderflowMessage::Ack(_) => Err(()),
            OrderflowMessage::Fill(f) => {
                Ok(FalconXMessage::Fill(FalconXFill { fill: *f }))
            }
            OrderflowMessage::Out(o) => Ok(FalconXMessage::Out(*o)),
        }
    }
}

impl TryInto<OrderflowMessage> for &FalconXMessage {
    type Error = ();

    fn try_into(self) -> Result<OrderflowMessage, ()> {
        match self {
            FalconXMessage::Order(o) => Ok(OrderflowMessage::Order(**o)),
            FalconXMessage::Reject(r) => Ok(OrderflowMessage::Reject(r.clone())),
            FalconXMessage::Fill(f) => Ok(OrderflowMessage::Fill(**f)),
            FalconXMessage::Out(o) => Ok(OrderflowMessage::Out(*o)),
            FalconXMessage::Folio(_) => Err(()),
            FalconXMessage::ExchangeExternalFills(..) => Err(()),
        }
    }
}

impl TryInto<FolioMessage> for &FalconXMessage {
    type Error = ();

    fn try_into(self) -> Result<FolioMessage, ()> {
        match self {
            FalconXMessage::Folio(f) => Ok(f.clone()),
            _ => Err(()),
        }
    }
}

impl TryFrom<&FolioMessage> for FalconXMessage {
    type Error = ();

    fn try_from(f: &FolioMessage) -> Result<Self, ()> {
        Ok(Self::Folio(f.clone()))
    }
}

#[derive(Debug, Clone, Copy, Pack, Serialize, Deserialize)]
pub struct FalconXOrder {
    #[serde(flatten)]
    pub order: Order,
}

impl From<Order> for FalconXOrder {
    fn from(order: Order) -> Self {
        Self { order }
    }
}

impl Deref for FalconXOrder {
    type Target = Order;

    fn deref(&self) -> &Self::Target {
        &self.order
    }
}

impl DerefMut for FalconXOrder {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.order
    }
}

#[derive(Debug, Clone, Pack, Serialize, Deserialize)]
pub struct FalconXFill {
    #[serde(flatten)]
    pub fill: Result<Fill, AberrantFill>,
}

impl Deref for FalconXFill {
    type Target = Result<Fill, AberrantFill>;

    fn deref(&self) -> &Self::Target {
        &self.fill
    }
}