1use deribit_base::{impl_json_debug_pretty, impl_json_display};
7use serde::{Deserialize, Serialize};
8use std::str::FromStr;
9
10#[derive(Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
12pub enum MsgType {
13 Heartbeat,
15 TestRequest,
17 ResendRequest,
19 Reject,
21 BusinessMessageReject,
23 SequenceReset,
25 Logout,
27 ExecutionReport,
29 OrderCancelReject,
31 Logon,
33 NewOrderSingle,
35 OrderCancelRequest,
37 OrderCancelReplaceRequest,
39 QuoteRequest,
41 MarketDataRequest,
43 MarketDataSnapshotFullRefresh,
45 MarketDataIncrementalRefresh,
47 MarketDataRequestReject,
49 QuoteCancel,
51 MassQuoteAcknowledgement,
53 SecurityDefinitionRequest,
55 SecurityDefinition,
57 SecurityStatusRequest,
59 SecurityStatus,
61 MassQuote,
63 OrderMassCancelRequest,
65 OrderMassCancelReport,
67 SecurityListRequest,
69 SecurityList,
71 QuoteStatusReport,
73 RfqRequest,
75 QuoteRequestReject,
77 TradeCaptureReportRequest,
79 TradeCaptureReport,
81 TradeCaptureReportRequestAck,
83 OrderMassStatusRequest,
85 RequestForPositions,
87 PositionReport,
89 UserRequest,
91 UserResponse,
93 MmProtectionLimits,
95 MmProtectionLimitsResult,
97 MmProtectionReset,
99}
100
101impl MsgType {
102 pub fn as_str(&self) -> &'static str {
104 match self {
105 MsgType::Heartbeat => "0",
106 MsgType::TestRequest => "1",
107 MsgType::ResendRequest => "2",
108 MsgType::Reject => "3",
109 MsgType::BusinessMessageReject => "j",
110 MsgType::SequenceReset => "4",
111 MsgType::Logout => "5",
112 MsgType::ExecutionReport => "8",
113 MsgType::OrderCancelReject => "9",
114 MsgType::Logon => "A",
115 MsgType::NewOrderSingle => "D",
116 MsgType::OrderCancelRequest => "F",
117 MsgType::OrderCancelReplaceRequest => "G",
118 MsgType::QuoteRequest => "R",
119 MsgType::MarketDataRequest => "V",
120 MsgType::MarketDataSnapshotFullRefresh => "W",
121 MsgType::MarketDataIncrementalRefresh => "X",
122 MsgType::MarketDataRequestReject => "Y",
123 MsgType::QuoteCancel => "Z",
124 MsgType::MassQuoteAcknowledgement => "b",
125 MsgType::SecurityDefinitionRequest => "c",
126 MsgType::SecurityDefinition => "d",
127 MsgType::SecurityStatusRequest => "e",
128 MsgType::SecurityStatus => "f",
129 MsgType::MassQuote => "i",
130 MsgType::OrderMassCancelRequest => "q",
131 MsgType::OrderMassCancelReport => "r",
132 MsgType::SecurityListRequest => "x",
133 MsgType::SecurityList => "y",
134 MsgType::QuoteStatusReport => "AI",
135 MsgType::RfqRequest => "AH",
136 MsgType::QuoteRequestReject => "AG",
137 MsgType::TradeCaptureReportRequest => "AD",
138 MsgType::TradeCaptureReport => "AE",
139 MsgType::TradeCaptureReportRequestAck => "AQ",
140 MsgType::OrderMassStatusRequest => "AF",
141 MsgType::RequestForPositions => "AN",
142 MsgType::PositionReport => "AP",
143 MsgType::UserRequest => "BE",
144 MsgType::UserResponse => "BF",
145 MsgType::MmProtectionLimits => "MM",
146 MsgType::MmProtectionLimitsResult => "MR",
147 MsgType::MmProtectionReset => "MZ",
148 }
149 }
150}
151
152#[derive(Debug, Clone, PartialEq, Eq)]
154pub struct ParseMsgTypeError(pub String);
155
156impl std::fmt::Display for ParseMsgTypeError {
157 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
158 write!(f, "Unknown message type: {}", self.0)
159 }
160}
161
162impl std::error::Error for ParseMsgTypeError {}
163
164impl FromStr for MsgType {
165 type Err = ParseMsgTypeError;
166
167 fn from_str(s: &str) -> Result<Self, Self::Err> {
168 match s {
169 "0" => Ok(MsgType::Heartbeat),
170 "1" => Ok(MsgType::TestRequest),
171 "2" => Ok(MsgType::ResendRequest),
172 "3" => Ok(MsgType::Reject),
173 "j" => Ok(MsgType::BusinessMessageReject),
174 "4" => Ok(MsgType::SequenceReset),
175 "5" => Ok(MsgType::Logout),
176 "8" => Ok(MsgType::ExecutionReport),
177 "9" => Ok(MsgType::OrderCancelReject),
178 "A" => Ok(MsgType::Logon),
179 "D" => Ok(MsgType::NewOrderSingle),
180 "F" => Ok(MsgType::OrderCancelRequest),
181 "G" => Ok(MsgType::OrderCancelReplaceRequest),
182 "R" => Ok(MsgType::QuoteRequest),
183 "V" => Ok(MsgType::MarketDataRequest),
184 "W" => Ok(MsgType::MarketDataSnapshotFullRefresh),
185 "X" => Ok(MsgType::MarketDataIncrementalRefresh),
186 "Y" => Ok(MsgType::MarketDataRequestReject),
187 "Z" => Ok(MsgType::QuoteCancel),
188 "b" => Ok(MsgType::MassQuoteAcknowledgement),
189 "c" => Ok(MsgType::SecurityDefinitionRequest),
190 "d" => Ok(MsgType::SecurityDefinition),
191 "e" => Ok(MsgType::SecurityStatusRequest),
192 "f" => Ok(MsgType::SecurityStatus),
193 "i" => Ok(MsgType::MassQuote),
194 "q" => Ok(MsgType::OrderMassCancelRequest),
195 "r" => Ok(MsgType::OrderMassCancelReport),
196 "x" => Ok(MsgType::SecurityListRequest),
197 "y" => Ok(MsgType::SecurityList),
198 "AI" => Ok(MsgType::QuoteStatusReport),
199 "AH" => Ok(MsgType::RfqRequest),
200 "AG" => Ok(MsgType::QuoteRequestReject),
201 "AD" => Ok(MsgType::TradeCaptureReportRequest),
202 "AE" => Ok(MsgType::TradeCaptureReport),
203 "AQ" => Ok(MsgType::TradeCaptureReportRequestAck),
204 "AF" => Ok(MsgType::OrderMassStatusRequest),
205 "AN" => Ok(MsgType::RequestForPositions),
206 "AP" => Ok(MsgType::PositionReport),
207 "BE" => Ok(MsgType::UserRequest),
208 "BF" => Ok(MsgType::UserResponse),
209 "MM" => Ok(MsgType::MmProtectionLimits),
210 "MR" => Ok(MsgType::MmProtectionLimitsResult),
211 "MZ" => Ok(MsgType::MmProtectionReset),
212 _ => Err(ParseMsgTypeError(s.to_string())),
213 }
214 }
215}
216
217#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
219pub enum ExecType {
220 New,
222 DoneForDay,
224 Canceled,
226 Replaced,
228 PendingCancel,
230 Stopped,
232 Rejected,
234 Suspended,
236 PendingNew,
238 Calculated,
240 Expired,
242 Restated,
244 PendingReplace,
246 Trade,
248 TradeCorrect,
250 TradeCancel,
252 OrderStatus,
254}
255
256impl From<ExecType> for char {
257 fn from(exec_type: ExecType) -> Self {
258 match exec_type {
259 ExecType::New => '0',
260 ExecType::DoneForDay => '3',
261 ExecType::Canceled => '4',
262 ExecType::Replaced => '5',
263 ExecType::PendingCancel => '6',
264 ExecType::Stopped => '7',
265 ExecType::Rejected => '8',
266 ExecType::Suspended => '9',
267 ExecType::PendingNew => 'A',
268 ExecType::Calculated => 'B',
269 ExecType::Expired => 'C',
270 ExecType::Restated => 'D',
271 ExecType::PendingReplace => 'E',
272 ExecType::Trade => 'F',
273 ExecType::TradeCorrect => 'G',
274 ExecType::TradeCancel => 'H',
275 ExecType::OrderStatus => 'I',
276 }
277 }
278}
279
280impl TryFrom<char> for ExecType {
281 type Error = String;
282
283 fn try_from(value: char) -> Result<Self, Self::Error> {
284 match value {
285 '0' => Ok(ExecType::New),
286 '3' => Ok(ExecType::DoneForDay),
287 '4' => Ok(ExecType::Canceled),
288 '5' => Ok(ExecType::Replaced),
289 '6' => Ok(ExecType::PendingCancel),
290 '7' => Ok(ExecType::Stopped),
291 '8' => Ok(ExecType::Rejected),
292 '9' => Ok(ExecType::Suspended),
293 'A' => Ok(ExecType::PendingNew),
294 'B' => Ok(ExecType::Calculated),
295 'C' => Ok(ExecType::Expired),
296 'D' => Ok(ExecType::Restated),
297 'E' => Ok(ExecType::PendingReplace),
298 'F' => Ok(ExecType::Trade),
299 'G' => Ok(ExecType::TradeCorrect),
300 'H' => Ok(ExecType::TradeCancel),
301 'I' => Ok(ExecType::OrderStatus),
302 _ => Err(format!("Invalid ExecType: {}", value)),
303 }
304 }
305}
306
307#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
309pub enum MDEntryType {
310 Bid,
312 Offer,
314 Trade,
316 IndexValue,
318 OpeningPrice,
320 ClosingPrice,
322 SettlementPrice,
324 TradingSessionHighPrice,
326 TradingSessionLowPrice,
328 TradingSessionVWAPPrice,
330 Imbalance,
332 TradeVolume,
334 OpenInterest,
336}
337
338#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
340pub enum SecurityType {
341 Future,
343 Option,
345 Spot,
347 Index,
349}
350
351impl_json_debug_pretty!(MsgType, ExecType, MDEntryType, SecurityType);
352impl_json_display!(MsgType, ExecType, MDEntryType, SecurityType);