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 SequenceReset,
23 Logout,
25 ExecutionReport,
27 OrderCancelReject,
29 Logon,
31 NewOrderSingle,
33 OrderCancelRequest,
35 OrderCancelReplaceRequest,
37 QuoteRequest,
39 MarketDataRequest,
41 MarketDataSnapshotFullRefresh,
43 MarketDataIncrementalRefresh,
45 MarketDataRequestReject,
47 QuoteCancel,
49 MassQuoteAcknowledgement,
51 SecurityDefinitionRequest,
53 SecurityDefinition,
55 SecurityStatusRequest,
57 SecurityStatus,
59 MassQuote,
61 OrderMassCancelRequest,
63 OrderMassCancelReport,
65 SecurityListRequest,
67 SecurityList,
69 QuoteStatusReport,
71 RfqRequest,
73 QuoteRequestReject,
75 TradeCaptureReportRequest,
77 TradeCaptureReport,
79 TradeCaptureReportRequestAck,
81 OrderMassStatusRequest,
83 RequestForPositions,
85 PositionReport,
87 UserRequest,
89 UserResponse,
91 MmProtectionLimits,
93 MmProtectionLimitsResult,
95 MmProtectionReset,
97}
98
99impl MsgType {
100 pub fn as_str(&self) -> &'static str {
102 match self {
103 MsgType::Heartbeat => "0",
104 MsgType::TestRequest => "1",
105 MsgType::ResendRequest => "2",
106 MsgType::Reject => "3",
107 MsgType::SequenceReset => "4",
108 MsgType::Logout => "5",
109 MsgType::ExecutionReport => "8",
110 MsgType::OrderCancelReject => "9",
111 MsgType::Logon => "A",
112 MsgType::NewOrderSingle => "D",
113 MsgType::OrderCancelRequest => "F",
114 MsgType::OrderCancelReplaceRequest => "G",
115 MsgType::QuoteRequest => "R",
116 MsgType::MarketDataRequest => "V",
117 MsgType::MarketDataSnapshotFullRefresh => "W",
118 MsgType::MarketDataIncrementalRefresh => "X",
119 MsgType::MarketDataRequestReject => "Y",
120 MsgType::QuoteCancel => "Z",
121 MsgType::MassQuoteAcknowledgement => "b",
122 MsgType::SecurityDefinitionRequest => "c",
123 MsgType::SecurityDefinition => "d",
124 MsgType::SecurityStatusRequest => "e",
125 MsgType::SecurityStatus => "f",
126 MsgType::MassQuote => "i",
127 MsgType::OrderMassCancelRequest => "q",
128 MsgType::OrderMassCancelReport => "r",
129 MsgType::SecurityListRequest => "x",
130 MsgType::SecurityList => "y",
131 MsgType::QuoteStatusReport => "AI",
132 MsgType::RfqRequest => "AH",
133 MsgType::QuoteRequestReject => "AG",
134 MsgType::TradeCaptureReportRequest => "AD",
135 MsgType::TradeCaptureReport => "AE",
136 MsgType::TradeCaptureReportRequestAck => "AQ",
137 MsgType::OrderMassStatusRequest => "AF",
138 MsgType::RequestForPositions => "AN",
139 MsgType::PositionReport => "AP",
140 MsgType::UserRequest => "BE",
141 MsgType::UserResponse => "BF",
142 MsgType::MmProtectionLimits => "MM",
143 MsgType::MmProtectionLimitsResult => "MR",
144 MsgType::MmProtectionReset => "MZ",
145 }
146 }
147}
148
149#[derive(Debug, Clone, PartialEq, Eq)]
151pub struct ParseMsgTypeError(pub String);
152
153impl std::fmt::Display for ParseMsgTypeError {
154 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
155 write!(f, "Unknown message type: {}", self.0)
156 }
157}
158
159impl std::error::Error for ParseMsgTypeError {}
160
161impl FromStr for MsgType {
162 type Err = ParseMsgTypeError;
163
164 fn from_str(s: &str) -> Result<Self, Self::Err> {
165 match s {
166 "0" => Ok(MsgType::Heartbeat),
167 "1" => Ok(MsgType::TestRequest),
168 "2" => Ok(MsgType::ResendRequest),
169 "3" => Ok(MsgType::Reject),
170 "4" => Ok(MsgType::SequenceReset),
171 "5" => Ok(MsgType::Logout),
172 "8" => Ok(MsgType::ExecutionReport),
173 "9" => Ok(MsgType::OrderCancelReject),
174 "A" => Ok(MsgType::Logon),
175 "D" => Ok(MsgType::NewOrderSingle),
176 "F" => Ok(MsgType::OrderCancelRequest),
177 "G" => Ok(MsgType::OrderCancelReplaceRequest),
178 "R" => Ok(MsgType::QuoteRequest),
179 "V" => Ok(MsgType::MarketDataRequest),
180 "W" => Ok(MsgType::MarketDataSnapshotFullRefresh),
181 "X" => Ok(MsgType::MarketDataIncrementalRefresh),
182 "Y" => Ok(MsgType::MarketDataRequestReject),
183 "Z" => Ok(MsgType::QuoteCancel),
184 "b" => Ok(MsgType::MassQuoteAcknowledgement),
185 "c" => Ok(MsgType::SecurityDefinitionRequest),
186 "d" => Ok(MsgType::SecurityDefinition),
187 "e" => Ok(MsgType::SecurityStatusRequest),
188 "f" => Ok(MsgType::SecurityStatus),
189 "i" => Ok(MsgType::MassQuote),
190 "q" => Ok(MsgType::OrderMassCancelRequest),
191 "r" => Ok(MsgType::OrderMassCancelReport),
192 "x" => Ok(MsgType::SecurityListRequest),
193 "y" => Ok(MsgType::SecurityList),
194 "AI" => Ok(MsgType::QuoteStatusReport),
195 "AH" => Ok(MsgType::RfqRequest),
196 "AG" => Ok(MsgType::QuoteRequestReject),
197 "AD" => Ok(MsgType::TradeCaptureReportRequest),
198 "AE" => Ok(MsgType::TradeCaptureReport),
199 "AQ" => Ok(MsgType::TradeCaptureReportRequestAck),
200 "AF" => Ok(MsgType::OrderMassStatusRequest),
201 "AN" => Ok(MsgType::RequestForPositions),
202 "AP" => Ok(MsgType::PositionReport),
203 "BE" => Ok(MsgType::UserRequest),
204 "BF" => Ok(MsgType::UserResponse),
205 "MM" => Ok(MsgType::MmProtectionLimits),
206 "MR" => Ok(MsgType::MmProtectionLimitsResult),
207 "MZ" => Ok(MsgType::MmProtectionReset),
208 _ => Err(ParseMsgTypeError(s.to_string())),
209 }
210 }
211}
212
213#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
215pub enum ExecType {
216 New,
218 DoneForDay,
220 Canceled,
222 Replaced,
224 PendingCancel,
226 Stopped,
228 Rejected,
230 Suspended,
232 PendingNew,
234 Calculated,
236 Expired,
238 Restated,
240 PendingReplace,
242 Trade,
244 TradeCorrect,
246 TradeCancel,
248 OrderStatus,
250}
251
252#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
254pub enum MDEntryType {
255 Bid,
257 Offer,
259 Trade,
261 IndexValue,
263 OpeningPrice,
265 ClosingPrice,
267 SettlementPrice,
269 TradingSessionHighPrice,
271 TradingSessionLowPrice,
273 TradingSessionVWAPPrice,
275 Imbalance,
277 TradeVolume,
279 OpenInterest,
281}
282
283#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
285pub enum SecurityType {
286 Future,
288 Option,
290 Spot,
292 Index,
294}
295
296impl_json_debug_pretty!(MsgType, ExecType, MDEntryType, SecurityType);
297impl_json_display!(MsgType, ExecType, MDEntryType, SecurityType);