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;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, schemars::JsonSchema)]
8#[serde(into = "i32")]
9#[non_exhaustive]
10pub enum SubTypeEnum {
11    Basic,
12    OrderBook,
13    OrderBookOdd,
14    Ticker,
15    Rt,
16    KlDay,
17    Kl5Min,
18    Kl15Min,
19    Kl30Min,
20    Kl60Min,
21    Kl1Min,
22    KlWeek,
23    KlMonth,
24    Broker,
25    KlQuarter,
26    KlYear,
27    Kl3Min,
28}
29
30impl From<SubTypeEnum> for i32 {
31    fn from(s: SubTypeEnum) -> Self {
32        s.as_i32()
33    }
34}
35
36impl ToolEnum for SubTypeEnum {
37    fn type_name() -> &'static str {
38        "sub_type"
39    }
40
41    fn from_i32(v: i32) -> Option<Self> {
42        Some(match v {
43            1 => Self::Basic,
44            2 => Self::OrderBook,
45            22 => Self::OrderBookOdd,
46            4 => Self::Ticker,
47            5 => Self::Rt,
48            6 => Self::KlDay,
49            7 => Self::Kl5Min,
50            8 => Self::Kl15Min,
51            9 => Self::Kl30Min,
52            10 => Self::Kl60Min,
53            11 => Self::Kl1Min,
54            12 => Self::KlWeek,
55            13 => Self::KlMonth,
56            14 => Self::Broker,
57            15 => Self::KlQuarter,
58            16 => Self::KlYear,
59            17 => Self::Kl3Min,
60            _ => return None,
61        })
62    }
63
64    fn from_str(s: &str) -> Option<Self> {
65        // case-insensitive match against canonical names + common aliases
66        Some(match s.trim().to_ascii_lowercase().as_str() {
67            "basic" => Self::Basic,
68            "orderbook" | "order_book" => Self::OrderBook,
69            "orderbookodd" | "orderbook_odd" | "order-book-odd" | "order_book_odd"
70            | "odd_orderbook" | "odd-lot-orderbook" | "odd_lot_orderbook" => Self::OrderBookOdd,
71            "ticker" => Self::Ticker,
72            "rt" => Self::Rt,
73            "kl_day" | "kl-day" | "day" => Self::KlDay,
74            "kl_5min" | "kl-5min" | "5min" => Self::Kl5Min,
75            "kl_15min" | "kl-15min" | "15min" => Self::Kl15Min,
76            "kl_30min" | "kl-30min" | "30min" => Self::Kl30Min,
77            "kl_60min" | "kl-60min" | "60min" => Self::Kl60Min,
78            "kl_1min" | "kl-1min" | "1min" => Self::Kl1Min,
79            "kl_week" | "kl-week" | "week" => Self::KlWeek,
80            "kl_month" | "kl-month" | "month" => Self::KlMonth,
81            "broker" => Self::Broker,
82            "kl_quarter" | "kl-quarter" | "quarter" => Self::KlQuarter,
83            "kl_year" | "kl-year" | "year" => Self::KlYear,
84            "kl_3min" | "kl-3min" | "3min" => Self::Kl3Min,
85            _ => return None,
86        })
87    }
88
89    fn as_i32(self) -> i32 {
90        match self {
91            Self::Basic => 1,
92            Self::OrderBook => 2,
93            Self::OrderBookOdd => 22,
94            Self::Ticker => 4,
95            Self::Rt => 5,
96            Self::KlDay => 6,
97            Self::Kl5Min => 7,
98            Self::Kl15Min => 8,
99            Self::Kl30Min => 9,
100            Self::Kl60Min => 10,
101            Self::Kl1Min => 11,
102            Self::KlWeek => 12,
103            Self::KlMonth => 13,
104            Self::Broker => 14,
105            Self::KlQuarter => 15,
106            Self::KlYear => 16,
107            Self::Kl3Min => 17,
108        }
109    }
110
111    fn all_int_values() -> Vec<i32> {
112        vec![1, 2, 22, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
113    }
114
115    fn all_string_values() -> Vec<&'static str> {
116        // Canonical strings use proto-suffix form (matches `Qot_Common.SubType`
117        // enum names), so developers referring to proto docs can paste them
118        // verbatim. `from_str` also accepts lowercase short aliases
119        // (e.g. `"day"` for `"KL_Day"`).
120        vec![
121            "Basic",
122            "OrderBook",
123            "OrderBookOdd",
124            "Ticker",
125            "RT",
126            "KL_Day",
127            "KL_5Min",
128            "KL_15Min",
129            "KL_30Min",
130            "KL_60Min",
131            "KL_1Min",
132            "KL_Week",
133            "KL_Month",
134            "Broker",
135            "KL_Quarter",
136            "KL_Year",
137            "KL_3Min",
138        ]
139    }
140}