1use axum::extract::{Json, State};
2use prost::Message;
3use serde::Serialize;
4use serde::de::DeserializeOwned;
5use serde_json::Value;
6
7use crate::adapter::{self, RestState};
8
9use super::RawApiResult;
10
11async fn raw_option_analytics_request<Req, Rsp>(
12 state: &RestState,
13 proto_id: u32,
14 body: Value,
15) -> RawApiResult
16where
17 Req: Message + Default + DeserializeOwned,
18 Rsp: Message + Default + Serialize,
19{
20 adapter::proto_request_raw::<Req, Rsp>(state, proto_id, Some(body)).await
21}
22
23pub async fn option_market_statistic(
24 State(state): State<RestState>,
25 Json(body): Json<Value>,
26) -> RawApiResult {
27 raw_option_analytics_request::<
28 futu_proto::qot_get_option_market_statistic::Request,
29 futu_proto::qot_get_option_market_statistic::Response,
30 >(
31 &state,
32 futu_core::proto_id::QOT_GET_OPTION_MARKET_STATISTIC,
33 body,
34 )
35 .await
36}
37
38pub async fn option_underlying_his_statistic(
39 State(state): State<RestState>,
40 Json(body): Json<Value>,
41) -> RawApiResult {
42 raw_option_analytics_request::<
43 futu_proto::qot_get_option_underlying_his_statistic::Request,
44 futu_proto::qot_get_option_underlying_his_statistic::Response,
45 >(
46 &state,
47 futu_core::proto_id::QOT_GET_OPTION_UNDERLYING_HIS_STATISTIC,
48 body,
49 )
50 .await
51}
52
53pub async fn option_underlying_overview(
54 State(state): State<RestState>,
55 Json(body): Json<Value>,
56) -> RawApiResult {
57 raw_option_analytics_request::<
58 futu_proto::qot_get_option_underlying_overview::Request,
59 futu_proto::qot_get_option_underlying_overview::Response,
60 >(
61 &state,
62 futu_core::proto_id::QOT_GET_OPTION_UNDERLYING_OVERVIEW,
63 body,
64 )
65 .await
66}
67
68pub async fn option_underlying_his_volatility(
69 State(state): State<RestState>,
70 Json(body): Json<Value>,
71) -> RawApiResult {
72 raw_option_analytics_request::<
73 futu_proto::qot_get_option_underlying_his_volatility::Request,
74 futu_proto::qot_get_option_underlying_his_volatility::Response,
75 >(
76 &state,
77 futu_core::proto_id::QOT_GET_OPTION_UNDERLYING_HIS_VOLATILITY,
78 body,
79 )
80 .await
81}
82
83pub async fn option_underlying_rank(
84 State(state): State<RestState>,
85 Json(body): Json<Value>,
86) -> RawApiResult {
87 raw_option_analytics_request::<
88 futu_proto::qot_get_option_underlying_rank::Request,
89 futu_proto::qot_get_option_underlying_rank::Response,
90 >(
91 &state,
92 futu_core::proto_id::QOT_GET_OPTION_UNDERLYING_RANK,
93 body,
94 )
95 .await
96}
97
98pub async fn option_rank(State(state): State<RestState>, Json(body): Json<Value>) -> RawApiResult {
99 raw_option_analytics_request::<
100 futu_proto::qot_get_option_rank::Request,
101 futu_proto::qot_get_option_rank::Response,
102 >(&state, futu_core::proto_id::QOT_GET_OPTION_RANK, body)
103 .await
104}
105
106pub async fn option_event(State(state): State<RestState>, Json(body): Json<Value>) -> RawApiResult {
107 raw_option_analytics_request::<
108 futu_proto::qot_get_option_event::Request,
109 futu_proto::qot_get_option_event::Response,
110 >(&state, futu_core::proto_id::QOT_GET_OPTION_EVENT, body)
111 .await
112}
113
114pub async fn option_event_alert(
115 State(state): State<RestState>,
116 Json(body): Json<Value>,
117) -> RawApiResult {
118 raw_option_analytics_request::<
119 futu_proto::qot_get_option_event_alert::Request,
120 futu_proto::qot_get_option_event_alert::Response,
121 >(
122 &state,
123 futu_core::proto_id::QOT_GET_OPTION_EVENT_ALERT,
124 body,
125 )
126 .await
127}
128
129pub async fn set_option_event_alert(
130 State(state): State<RestState>,
131 Json(body): Json<Value>,
132) -> RawApiResult {
133 raw_option_analytics_request::<
134 futu_proto::qot_set_option_event_alert::Request,
135 futu_proto::qot_set_option_event_alert::Response,
136 >(
137 &state,
138 futu_core::proto_id::QOT_SET_OPTION_EVENT_ALERT,
139 body,
140 )
141 .await
142}
143
144pub async fn option_zero_dte_screener(
145 State(state): State<RestState>,
146 Json(body): Json<Value>,
147) -> RawApiResult {
148 raw_option_analytics_request::<
149 futu_proto::qot_get_option_zero_dte_screener::Request,
150 futu_proto::qot_get_option_zero_dte_screener::Response,
151 >(
152 &state,
153 futu_core::proto_id::QOT_GET_OPTION_ZERO_DTE_SCREENER,
154 body,
155 )
156 .await
157}
158
159pub async fn option_zero_dte_contract(
160 State(state): State<RestState>,
161 Json(body): Json<Value>,
162) -> RawApiResult {
163 raw_option_analytics_request::<
164 futu_proto::qot_get_option_zero_dte_contract::Request,
165 futu_proto::qot_get_option_zero_dte_contract::Response,
166 >(
167 &state,
168 futu_core::proto_id::QOT_GET_OPTION_ZERO_DTE_CONTRACT,
169 body,
170 )
171 .await
172}
173
174pub async fn option_earnings_screener(
175 State(state): State<RestState>,
176 Json(body): Json<Value>,
177) -> RawApiResult {
178 raw_option_analytics_request::<
179 futu_proto::qot_get_option_earnings_screener::Request,
180 futu_proto::qot_get_option_earnings_screener::Response,
181 >(
182 &state,
183 futu_core::proto_id::QOT_GET_OPTION_EARNINGS_SCREENER,
184 body,
185 )
186 .await
187}
188
189pub async fn option_seller_screener(
190 State(state): State<RestState>,
191 Json(body): Json<Value>,
192) -> RawApiResult {
193 raw_option_analytics_request::<
194 futu_proto::qot_get_option_seller_screener::Request,
195 futu_proto::qot_get_option_seller_screener::Response,
196 >(
197 &state,
198 futu_core::proto_id::QOT_GET_OPTION_SELLER_SCREENER,
199 body,
200 )
201 .await
202}