Skip to main content

futu_mcp/tool_enums/
subtype_enum.rs

1//! Split from tool_enums.rs: SubTypeEnum.
2
3use 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        // Canonical strings use proto-suffix form (matches `Qot_Common.SubType`
133        // enum names), so developers referring to proto docs can paste them
134        // verbatim. `from_str` also accepts lowercase short aliases
135        // (e.g. `"day"` for `"KL_Day"`).
136        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}