1use serde::Serialize;
4
5use super::ToolEnum;
6use futu_core::qot_subscription::{
7 self, SUB_TYPE_BASIC, SUB_TYPE_BROKER, SUB_TYPE_KL_1MIN, SUB_TYPE_KL_3MIN, SUB_TYPE_KL_5MIN,
8 SUB_TYPE_KL_10MIN, SUB_TYPE_KL_15MIN, SUB_TYPE_KL_30MIN, SUB_TYPE_KL_60MIN, SUB_TYPE_KL_120MIN,
9 SUB_TYPE_KL_180MIN, SUB_TYPE_KL_240MIN, SUB_TYPE_KL_DAY, SUB_TYPE_KL_MONTH,
10 SUB_TYPE_KL_QUARTER, SUB_TYPE_KL_WEEK, SUB_TYPE_KL_YEAR, SUB_TYPE_ORDER_BOOK,
11 SUB_TYPE_ORDER_BOOK_ODD, SUB_TYPE_RT, SUB_TYPE_TICKER,
12};
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, schemars::JsonSchema)]
15#[serde(into = "i32")]
16#[non_exhaustive]
17pub enum SubTypeEnum {
18 Basic,
19 OrderBook,
20 OrderBookOdd,
21 Ticker,
22 Rt,
23 KlDay,
24 Kl5Min,
25 Kl15Min,
26 Kl30Min,
27 Kl60Min,
28 Kl1Min,
29 KlWeek,
30 KlMonth,
31 Broker,
32 KlQuarter,
33 KlYear,
34 Kl3Min,
35 Kl10Min,
36 Kl120Min,
37 Kl180Min,
38 Kl240Min,
39}
40
41impl From<SubTypeEnum> for i32 {
42 fn from(s: SubTypeEnum) -> Self {
43 s.as_i32()
44 }
45}
46
47impl SubTypeEnum {
48 fn to_core_sub_type(self) -> i32 {
49 match self {
50 Self::Basic => SUB_TYPE_BASIC,
51 Self::OrderBook => SUB_TYPE_ORDER_BOOK,
52 Self::OrderBookOdd => SUB_TYPE_ORDER_BOOK_ODD,
53 Self::Ticker => SUB_TYPE_TICKER,
54 Self::Rt => SUB_TYPE_RT,
55 Self::KlDay => SUB_TYPE_KL_DAY,
56 Self::Kl5Min => SUB_TYPE_KL_5MIN,
57 Self::Kl15Min => SUB_TYPE_KL_15MIN,
58 Self::Kl30Min => SUB_TYPE_KL_30MIN,
59 Self::Kl60Min => SUB_TYPE_KL_60MIN,
60 Self::Kl1Min => SUB_TYPE_KL_1MIN,
61 Self::KlWeek => SUB_TYPE_KL_WEEK,
62 Self::KlMonth => SUB_TYPE_KL_MONTH,
63 Self::Broker => SUB_TYPE_BROKER,
64 Self::KlQuarter => SUB_TYPE_KL_QUARTER,
65 Self::KlYear => SUB_TYPE_KL_YEAR,
66 Self::Kl3Min => SUB_TYPE_KL_3MIN,
67 Self::Kl10Min => SUB_TYPE_KL_10MIN,
68 Self::Kl120Min => SUB_TYPE_KL_120MIN,
69 Self::Kl180Min => SUB_TYPE_KL_180MIN,
70 Self::Kl240Min => SUB_TYPE_KL_240MIN,
71 }
72 }
73
74 fn from_core_sub_type(sub_type: i32) -> Option<Self> {
75 Some(match sub_type {
76 SUB_TYPE_BASIC => Self::Basic,
77 SUB_TYPE_ORDER_BOOK => Self::OrderBook,
78 SUB_TYPE_ORDER_BOOK_ODD => Self::OrderBookOdd,
79 SUB_TYPE_TICKER => Self::Ticker,
80 SUB_TYPE_RT => Self::Rt,
81 SUB_TYPE_KL_DAY => Self::KlDay,
82 SUB_TYPE_KL_5MIN => Self::Kl5Min,
83 SUB_TYPE_KL_15MIN => Self::Kl15Min,
84 SUB_TYPE_KL_30MIN => Self::Kl30Min,
85 SUB_TYPE_KL_60MIN => Self::Kl60Min,
86 SUB_TYPE_KL_1MIN => Self::Kl1Min,
87 SUB_TYPE_KL_WEEK => Self::KlWeek,
88 SUB_TYPE_KL_MONTH => Self::KlMonth,
89 SUB_TYPE_BROKER => Self::Broker,
90 SUB_TYPE_KL_QUARTER => Self::KlQuarter,
91 SUB_TYPE_KL_YEAR => Self::KlYear,
92 SUB_TYPE_KL_3MIN => Self::Kl3Min,
93 SUB_TYPE_KL_10MIN => Self::Kl10Min,
94 SUB_TYPE_KL_120MIN => Self::Kl120Min,
95 SUB_TYPE_KL_180MIN => Self::Kl180Min,
96 SUB_TYPE_KL_240MIN => Self::Kl240Min,
97 _ => return None,
98 })
99 }
100}
101
102impl ToolEnum for SubTypeEnum {
103 fn type_name() -> &'static str {
104 "sub_type"
105 }
106
107 fn from_i32(v: i32) -> Option<Self> {
108 qot_subscription::is_valid_sub_type(v)
109 .then_some(v)
110 .and_then(Self::from_core_sub_type)
111 }
112
113 fn from_str(s: &str) -> Option<Self> {
114 qot_subscription::qot_sub_type_from_str_alias(s)
115 .filter(|v| qot_subscription::is_valid_sub_type(*v))
116 .and_then(Self::from_core_sub_type)
117 }
118
119 fn as_i32(self) -> i32 {
120 self.to_core_sub_type()
121 }
122
123 fn all_int_values() -> Vec<i32> {
124 Self::all_string_values()
125 .into_iter()
126 .filter_map(Self::from_str)
127 .map(Self::as_i32)
128 .collect()
129 }
130
131 fn all_string_values() -> Vec<&'static str> {
132 vec![
137 "Basic",
138 "OrderBook",
139 "OrderBookOdd",
140 "Ticker",
141 "RT",
142 "KL_Day",
143 "KL_5Min",
144 "KL_15Min",
145 "KL_30Min",
146 "KL_60Min",
147 "KL_1Min",
148 "KL_Week",
149 "KL_Month",
150 "Broker",
151 "KL_Quarter",
152 "KL_Year",
153 "KL_3Min",
154 "KL_10Min",
155 "KL_120Min",
156 "KL_180Min",
157 "KL_240Min",
158 ]
159 }
160}