1use axum::extract::{Json, State};
6use axum::http::StatusCode;
7use serde_json::Value;
8
9use futu_core::proto_id;
10use futu_proto::qot_get_basic_qot;
11use futu_proto::qot_get_broker;
12use futu_proto::qot_get_capital_distribution;
13use futu_proto::qot_get_capital_flow;
14use futu_proto::qot_get_future_info;
15use futu_proto::qot_get_ipo_list;
16use futu_proto::qot_get_kl;
17use futu_proto::qot_get_market_state;
18use futu_proto::qot_get_option_chain;
19use futu_proto::qot_get_order_book;
20use futu_proto::qot_get_owner_plate;
21use futu_proto::qot_get_plate_security;
22use futu_proto::qot_get_plate_set;
23use futu_proto::qot_get_reference;
24use futu_proto::qot_get_rt;
25use futu_proto::qot_get_security_snapshot;
26use futu_proto::qot_get_static_info;
27use futu_proto::qot_get_sub_info;
28use futu_proto::qot_get_ticker;
29use futu_proto::qot_get_user_security;
30use futu_proto::qot_get_warrant;
31use futu_proto::qot_request_history_kl;
32use futu_proto::qot_stock_filter;
33use futu_proto::qot_sub;
34
35use crate::adapter::{self, RestState};
36
37type ApiResult = Result<Json<Value>, (StatusCode, Json<Value>)>;
38
39pub async fn subscribe(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
41 adapter::proto_request::<qot_sub::Request, qot_sub::Response>(
42 &state,
43 proto_id::QOT_SUB,
44 Some(body),
45 )
46 .await
47}
48
49pub async fn get_sub_info(State(state): State<RestState>) -> ApiResult {
51 adapter::proto_request::<qot_get_sub_info::Request, qot_get_sub_info::Response>(
52 &state,
53 proto_id::QOT_GET_SUB_INFO,
54 None,
55 )
56 .await
57}
58
59pub async fn get_basic_qot(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
61 adapter::proto_request::<qot_get_basic_qot::Request, qot_get_basic_qot::Response>(
62 &state,
63 proto_id::QOT_GET_BASIC_QOT,
64 Some(body),
65 )
66 .await
67}
68
69pub async fn get_kl(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
71 adapter::proto_request::<qot_get_kl::Request, qot_get_kl::Response>(
72 &state,
73 proto_id::QOT_GET_KL,
74 Some(body),
75 )
76 .await
77}
78
79pub async fn get_order_book(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
81 adapter::proto_request::<qot_get_order_book::Request, qot_get_order_book::Response>(
82 &state,
83 proto_id::QOT_GET_ORDER_BOOK,
84 Some(body),
85 )
86 .await
87}
88
89pub async fn get_broker(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
91 adapter::proto_request::<qot_get_broker::Request, qot_get_broker::Response>(
92 &state,
93 proto_id::QOT_GET_BROKER,
94 Some(body),
95 )
96 .await
97}
98
99pub async fn get_ticker(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
101 adapter::proto_request::<qot_get_ticker::Request, qot_get_ticker::Response>(
102 &state,
103 proto_id::QOT_GET_TICKER,
104 Some(body),
105 )
106 .await
107}
108
109pub async fn get_rt(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
111 adapter::proto_request::<qot_get_rt::Request, qot_get_rt::Response>(
112 &state,
113 proto_id::QOT_GET_RT,
114 Some(body),
115 )
116 .await
117}
118
119pub async fn get_snapshot(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
121 adapter::proto_request::<qot_get_security_snapshot::Request, qot_get_security_snapshot::Response>(
122 &state, proto_id::QOT_GET_SECURITY_SNAPSHOT, Some(body),
123 ).await
124}
125
126pub async fn get_static_info(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
128 adapter::proto_request::<qot_get_static_info::Request, qot_get_static_info::Response>(
129 &state,
130 proto_id::QOT_GET_STATIC_INFO,
131 Some(body),
132 )
133 .await
134}
135
136pub async fn get_plate_set(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
138 adapter::proto_request::<qot_get_plate_set::Request, qot_get_plate_set::Response>(
139 &state,
140 proto_id::QOT_GET_PLATE_SET,
141 Some(body),
142 )
143 .await
144}
145
146pub async fn get_plate_security(
148 State(state): State<RestState>,
149 Json(body): Json<Value>,
150) -> ApiResult {
151 adapter::proto_request::<qot_get_plate_security::Request, qot_get_plate_security::Response>(
152 &state,
153 proto_id::QOT_GET_PLATE_SECURITY,
154 Some(body),
155 )
156 .await
157}
158
159pub async fn get_reference(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
161 adapter::proto_request::<qot_get_reference::Request, qot_get_reference::Response>(
162 &state,
163 proto_id::QOT_GET_REFERENCE,
164 Some(body),
165 )
166 .await
167}
168
169pub async fn get_owner_plate(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
171 adapter::proto_request::<qot_get_owner_plate::Request, qot_get_owner_plate::Response>(
172 &state,
173 proto_id::QOT_GET_OWNER_PLATE,
174 Some(body),
175 )
176 .await
177}
178
179pub async fn get_option_chain(
181 State(state): State<RestState>,
182 Json(body): Json<Value>,
183) -> ApiResult {
184 adapter::proto_request::<qot_get_option_chain::Request, qot_get_option_chain::Response>(
185 &state,
186 proto_id::QOT_GET_OPTION_CHAIN,
187 Some(body),
188 )
189 .await
190}
191
192pub async fn get_warrant(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
194 adapter::proto_request::<qot_get_warrant::Request, qot_get_warrant::Response>(
195 &state,
196 proto_id::QOT_GET_WARRANT,
197 Some(body),
198 )
199 .await
200}
201
202pub async fn get_capital_flow(
204 State(state): State<RestState>,
205 Json(body): Json<Value>,
206) -> ApiResult {
207 adapter::proto_request::<qot_get_capital_flow::Request, qot_get_capital_flow::Response>(
208 &state,
209 proto_id::QOT_GET_CAPITAL_FLOW,
210 Some(body),
211 )
212 .await
213}
214
215pub async fn get_capital_distribution(
217 State(state): State<RestState>,
218 Json(body): Json<Value>,
219) -> ApiResult {
220 adapter::proto_request::<
221 qot_get_capital_distribution::Request,
222 qot_get_capital_distribution::Response,
223 >(&state, proto_id::QOT_GET_CAPITAL_DISTRIBUTION, Some(body))
224 .await
225}
226
227pub async fn get_user_security(
229 State(state): State<RestState>,
230 Json(body): Json<Value>,
231) -> ApiResult {
232 adapter::proto_request::<qot_get_user_security::Request, qot_get_user_security::Response>(
233 &state,
234 proto_id::QOT_GET_USER_SECURITY,
235 Some(body),
236 )
237 .await
238}
239
240pub async fn stock_filter(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
242 adapter::proto_request::<qot_stock_filter::Request, qot_stock_filter::Response>(
243 &state,
244 proto_id::QOT_STOCK_FILTER,
245 Some(body),
246 )
247 .await
248}
249
250pub async fn get_ipo_list(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
252 adapter::proto_request::<qot_get_ipo_list::Request, qot_get_ipo_list::Response>(
253 &state,
254 proto_id::QOT_GET_IPO_LIST,
255 Some(body),
256 )
257 .await
258}
259
260pub async fn get_future_info(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
262 adapter::proto_request::<qot_get_future_info::Request, qot_get_future_info::Response>(
263 &state,
264 proto_id::QOT_GET_FUTURE_INFO,
265 Some(body),
266 )
267 .await
268}
269
270pub async fn get_market_state(
272 State(state): State<RestState>,
273 Json(body): Json<Value>,
274) -> ApiResult {
275 adapter::proto_request::<qot_get_market_state::Request, qot_get_market_state::Response>(
276 &state,
277 proto_id::QOT_GET_MARKET_STATE,
278 Some(body),
279 )
280 .await
281}
282
283pub async fn request_history_kl(
285 State(state): State<RestState>,
286 Json(body): Json<Value>,
287) -> ApiResult {
288 adapter::proto_request::<qot_request_history_kl::Request, qot_request_history_kl::Response>(
289 &state,
290 proto_id::QOT_REQUEST_HISTORY_KL,
291 Some(body),
292 )
293 .await
294}