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
use crate::{orderflow::*, symbology::market::NormalizedMarketInfo};
use derive::FromValue;
use netidx_derive::Pack;
use rust_decimal::Decimal;
use serde_derive::{Deserialize, Serialize};
use std::ops::{Deref, DerefMut};

#[derive(Debug, Clone, Serialize, Deserialize, Pack)]
pub struct B2C2MarketInfo {
    pub tick_size: Decimal,
    pub step_size: Decimal,
    pub is_delisted: bool,
}

impl NormalizedMarketInfo for B2C2MarketInfo {
    fn tick_size(&self) -> Decimal {
        self.tick_size
    }

    fn step_size(&self) -> Decimal {
        self.step_size
    }

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

impl std::fmt::Display for B2C2MarketInfo {
    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 B2C2Message {
    Order(B2C2Order),
    Reject(Reject),
    Fill(B2C2Fill),
    Out(Out),
    ExchangeExternalFills(Vec<B2C2Fill>),
}

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

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

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

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

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

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

impl Deref for B2C2Order {
    type Target = Order;

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

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

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

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

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