1#![allow(non_camel_case_types)]
9
10use std::fmt;
11use std::str::FromStr;
12
13macro_rules! wire_enum {
14 (
15 $(#[$meta:meta])*
16 $name:ident,
17 display_name = $display:expr,
18 { $( $variant:ident = $wire:literal [ $( $alias:literal ),* ] ),* $(,)? }
19 ) => {
20 $(#[$meta])*
21 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23 pub enum $name {
24 $( #[cfg_attr(feature = "serde", serde(rename = $wire))] $variant ),*
25 }
26
27 impl $name {
28 pub const ALL: &'static [Self] = &[ $( Self::$variant ),* ];
30
31 pub fn as_str(&self) -> &'static str {
33 match self { $( Self::$variant => $wire ),* }
34 }
35
36 pub fn chinese_alias(&self) -> &'static [&'static str] {
38 match self { $( Self::$variant => &[ $( $alias ),* ] ),* }
39 }
40
41 pub const DISPLAY: &'static str = $display;
43 }
44
45 impl fmt::Display for $name {
46 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
47 f.write_str(self.as_str())
48 }
49 }
50
51 impl FromStr for $name {
52 type Err = EnumParseError;
53 fn from_str(s: &str) -> Result<Self, Self::Err> {
56 $( if s == $wire { return Ok(Self::$variant); } )*
57 $(
58 $( if s == $alias { return Ok(Self::$variant); } )*
59 )*
60 Err(EnumParseError { input: s.to_string(), type_name: $display })
61 }
62 }
63 };
64}
65
66#[derive(Debug, Clone, PartialEq, Eq)]
68pub struct EnumParseError {
69 pub input: String,
71 pub type_name: &'static str,
73}
74
75impl fmt::Display for EnumParseError {
76 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
77 write!(f, "unknown {} value: {:?}", self.type_name, self.input)
78 }
79}
80
81impl std::error::Error for EnumParseError {}
82
83wire_enum!(
84 Direction, display_name = "Direction",
86 {
87 LONG = "LONG" ["多"],
88 SHORT = "SHORT" ["空"],
89 NET = "NET" ["净"]
90 }
91);
92
93wire_enum!(
94 Offset, display_name = "Offset",
96 {
97 NONE = "NONE" [""],
98 OPEN = "OPEN" ["开"],
99 CLOSE = "CLOSE" ["平"],
100 CLOSETODAY = "CLOSETODAY" ["平今"],
101 CLOSEYESTERDAY = "CLOSEYESTERDAY" ["平昨"]
102 }
103);
104
105wire_enum!(
106 Status, display_name = "Status",
113 {
114 SUBMITTING = "SUBMITTING" ["提交中"],
115 NOTTRADED = "NOTTRADED" ["未成交"],
116 PARTTRADED = "PARTTRADED" ["部分成交"],
117 ALLTRADED = "ALLTRADED" ["全部成交"],
118 CANCELLED = "CANCELLED" ["已撤销"],
119 REJECTED = "REJECTED" ["拒单"],
120 UNKNOWN = "UNKNOWN" ["未知"]
121 }
122);
123
124wire_enum!(
125 Asset, display_name = "Asset",
131 {
132 EQUITY = "EQUITY" ["股票"],
133 BOND = "BOND" ["债券"],
134 FUTURES = "FUTURES" ["期货"],
135 OPTION = "OPTION" ["期权"],
136 FOREX = "FOREX" ["外汇"],
137 UNKNOWN = "UNKNOWN" ["未知"]
138 }
139);
140
141wire_enum!(
142 InstrumentType, display_name = "InstrumentType",
144 {
145 STOCK = "STOCK" ["股票"],
146 ETF = "ETF" [],
147 INDEX = "INDEX" ["指数"],
148 FUTURES_CONTRACT = "FUTURES_CONTRACT" ["期货合约"],
149 MAIN_CONTRACT = "MAIN_CONTRACT" ["主力合约"],
150 CONTINUOUS_CONTRACT = "CONTINUOUS_CONTRACT" ["连续合约"],
151 OPTION_CONTRACT = "OPTION_CONTRACT" ["期权合约"],
152 BOND = "BOND" ["债券"],
153 CONVERTIBLE_BOND = "CONVERTIBLE_BOND" ["可转债"],
154 SPREAD = "SPREAD" ["价差组合"],
155 HEDGE = "HEDGE" ["对冲组合"]
156 }
157);
158
159wire_enum!(
160 OrderType, display_name = "OrderType",
166 {
167 LIMIT = "LIMIT" ["限价"],
168 MARKET = "MARKET" ["市价"],
169 STOP = "STOP" [],
170 FAK = "FAK" [],
171 FOK = "FOK" [],
172 RFQ = "RFQ" ["询价"],
173 UNKNOWN = "UNKNOWN" ["未知"]
174 }
175);
176
177wire_enum!(
178 OptionType, display_name = "OptionType",
180 {
181 CALL = "CALL" ["看涨期权"],
182 PUT = "PUT" ["看跌期权"]
183 }
184);
185
186wire_enum!(
187 Currency, display_name = "Currency",
189 {
190 USD = "USD" [],
191 HKD = "HKD" [],
192 CNY = "CNY" [],
193 CAD = "CAD" []
194 }
195);
196
197wire_enum!(
198 Exchange, display_name = "Exchange",
208 {
209 CFFEX = "CFFEX" [],
210 SHFE = "SHFE" [],
211 CZCE = "CZCE" [],
212 DCE = "DCE" [],
213 INE = "INE" [],
214 GFEX = "GFEX" [],
215 SSE = "SSE" [],
216 SZSE = "SZSE" [],
217 BSE = "BSE" [],
218 SHHK = "SHHK" [],
219 SZHK = "SZHK" [],
220 SGE = "SGE" [],
221 WXE = "WXE" [],
222 CFETS = "CFETS" [],
223 XBOND = "XBOND" [],
224 SMART = "SMART" [],
225 NYSE = "NYSE" [],
226 NASDAQ = "NASDAQ" [],
227 ARCA = "ARCA" [],
228 EDGEA = "EDGEA" [],
229 ISLAND = "ISLAND" [],
230 BATS = "BATS" [],
231 IEX = "IEX" [],
232 AMEX = "AMEX" [],
233 TSE = "TSE" [],
234 NYMEX = "NYMEX" [],
235 COMEX = "COMEX" [],
236 GLOBEX = "GLOBEX" [],
237 IDEALPRO = "IDEALPRO" [],
238 CME = "CME" [],
239 ICE = "ICE" [],
240 SEHK = "SEHK" [],
241 HKFE = "HKFE" [],
242 SGX = "SGX" [],
243 CBOT = "CBT" [],
244 CBOE = "CBOE" [],
245 CFE = "CFE" [],
246 DME = "DME" [],
247 EUREX = "EUX" [],
248 APEX = "APEX" [],
249 LME = "LME" [],
250 BMD = "BMD" [],
251 TOCOM = "TOCOM" [],
252 EUNX = "EUNX" [],
253 KRX = "KRX" [],
254 OTC = "OTC" [],
255 IBKRATS = "IBKRATS" [],
256 LOCAL = "LOCAL" [],
257 ETF_INDEX = "ETF_index" [],
258 SW = "SW" [],
259 UNKNOWN = "UNKNOWN" ["未知"]
260 }
261);
262
263wire_enum!(
264 Interval, display_name = "Interval",
266 {
267 TICK = "TICK" [],
268 MINUTE = "MINUTE" [],
269 MINUTE_5 = "MINUTE_5" [],
270 MINUTE_15 = "MINUTE_15" [],
271 MINUTE_30 = "MINUTE_30" [],
272 HOUR = "HOUR" [],
273 DAILY = "DAILY" [],
274 WEEKLY = "WEEKLY" []
275 }
276);
277
278impl Interval {
279 pub fn seconds(&self) -> i64 {
282 match self {
283 Self::TICK => 0,
284 Self::MINUTE => 60,
285 Self::MINUTE_5 => 300,
286 Self::MINUTE_15 => 900,
287 Self::MINUTE_30 => 1800,
288 Self::HOUR => 3600,
289 Self::DAILY => 86400,
290 Self::WEEKLY => 604800,
291 }
292 }
293}
294
295pub const ACTIVE_STATUSES: [Status; 3] =
297 [Status::SUBMITTING, Status::NOTTRADED, Status::PARTTRADED];
298
299impl Status {
300 pub fn is_active(&self) -> bool {
302 ACTIVE_STATUSES.contains(self)
303 }
304}
305
306impl Default for Exchange {
310 fn default() -> Self {
311 Self::LOCAL
312 }
313}
314
315impl Default for OrderType {
317 fn default() -> Self {
318 Self::LIMIT
319 }
320}
321
322impl Default for Offset {
324 fn default() -> Self {
325 Self::NONE
326 }
327}
328
329impl Default for Status {
331 fn default() -> Self {
332 Self::SUBMITTING
333 }
334}
335
336impl Default for Direction {
338 fn default() -> Self {
339 Self::NET
340 }
341}
342
343impl Default for Asset {
345 fn default() -> Self {
346 Self::EQUITY
347 }
348}