1use serde::{Deserialize, Deserializer, Serialize};
2
3#[derive(Clone, Debug, Deserialize, Serialize)]
4#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
5#[derive(Default)]
6pub enum ContractType {
7 #[default]
8 Perpetual,
9 CurrentMonth,
10 NextMonth,
11 CurrentQuarter,
12 NextQuarter,
13 PerpetualDelivering,
14}
15
16#[derive(Clone, Debug, Deserialize, Serialize)]
17#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
18pub enum ContractStatus {
19 PendingTrading,
20 Trading,
21 PreDelivering,
22 Delivering,
23 Delivered,
24 PreSettle,
25 Settling,
26 Close,
27}
28
29#[derive(Clone, Debug, Deserialize, Serialize)]
30#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
31pub enum OrderStatus {
32 New,
33 PartiallyFilled,
34 Filled,
35 Canceled,
36 Rejected,
37 Expired,
38 ExpiredInMatch,
39}
40
41#[derive(Clone, Debug, Deserialize, Serialize)]
42#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
43#[derive(Default)]
44pub enum OrderType {
45 Limit,
46 #[default]
47 Market,
48 Stop,
49 StopMarket,
50 TakeProfit,
51 TakeProfitMarket,
52 TrailingStopMarket,
53}
54
55#[derive(Clone, Debug, Deserialize, Serialize)]
56#[serde(rename_all = "UPPERCASE")]
57pub enum OrderResponseType {
58 Ack,
59 Result,
60}
61
62#[derive(Clone, Debug, Deserialize, Serialize)]
63#[serde(rename_all = "UPPERCASE")]
64#[derive(Default)]
65pub enum OrderSide {
66 #[default]
67 Buy,
68 Sell,
69}
70
71#[derive(Clone, Debug, Deserialize, Serialize)]
72#[serde(rename_all = "UPPERCASE")]
73#[derive(Default)]
74pub enum PositionSide {
75 Both,
76 #[default]
77 Long,
78 Short,
79}
80
81#[derive(Clone, Debug, Deserialize, Serialize)]
82#[serde(rename_all = "UPPERCASE")]
83pub enum TimeInForce {
84 Gtc,
85 Ioc,
86 Fok,
87 Gtx,
88 Gtd,
89}
90
91#[derive(Clone, Debug, Deserialize, Serialize)]
92#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
93pub enum WorkingType {
94 MarkPrice,
95 ContractPrice,
96}
97
98#[derive(Clone, Debug, Deserialize, Serialize)]
99#[serde(rename_all = "UPPERCASE")]
100pub enum ResponseType {
101 Ack,
102 Result,
103}
104
105#[derive(Clone, Debug, Deserialize, Serialize)]
106#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
107pub enum StpModes {
108 ExpireTaker,
109 ExpireBoth,
110 ExpireMaker,
111}
112
113#[derive(Clone, Debug, Deserialize, Serialize)]
114#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
115pub enum PriceMatch {
116 None,
117 Opponent,
118 Opponent5,
119 Opponent10,
120 Opponent20,
121 Queue,
122 Queue5,
123 Queue10,
124 Queue20,
125}
126
127#[derive(Debug, Clone, Serialize)]
128pub enum AdlLevel {
129 LowestRisk,
130 LowRisk,
131 Medium,
132 HighRisk,
133 HighestRisk,
134}
135
136impl<'de> Deserialize<'de> for AdlLevel {
137 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
138 where
139 D: Deserializer<'de>,
140 {
141 let value: u8 = Deserialize::deserialize(deserializer)?;
142 Ok(match value {
143 0 => AdlLevel::LowestRisk,
144 1 => AdlLevel::LowRisk,
145 2 => AdlLevel::Medium,
146 3 => AdlLevel::HighRisk,
147 4 => AdlLevel::HighestRisk,
148 _ => return Err(serde::de::Error::custom("Invalid ADL level")),
149 })
150 }
151}