1use crate::sys::{
2 XTPFundTransferNotice, XTPOrderCancelInfo, XTPOrderInfo, XTPQueryAssetRsp, XTPQueryETFBaseRsp,
3 XTPQueryETFComponentRsp, XTPQueryIPOQuotaRsp, XTPQueryIPOTickerRsp,
4 XTPQueryOptionAuctionInfoRsp, XTPQueryOrderRsp, XTPQueryStkPositionRsp, XTPQueryTradeRsp,
5 XTPStructuredFundInfo, XTPTradeReport, XTPRI,
6};
7use crate::types;
8use crate::types::FromRaw;
9use libc::{c_int, c_void};
10
11type RXTPRI<'a> = types::XTPRspInfoStruct;
12
13#[allow(unused_variables)]
14pub trait TraderSpi {
15 fn on_disconnected(&self, session_id: u64, reason: i32) {}
16 fn on_error(&self, error_info: RXTPRI) {}
17 fn on_order_event(&self, order_info: types::XTPOrderInfo, error_info: RXTPRI, session_id: u64) {
18 }
19 fn on_trade_event(&self, x_trade_info: types::XTPTradeReport, session_id: u64) {}
20 fn on_cancel_order_error(
21 &self,
22 cancel_info: types::XTPOrderCancelInfo,
23 error_info: RXTPRI,
24 session_id: u64,
25 ) {
26 }
27 fn on_query_order(
28 &self,
29 order_info: types::XTPOrderInfo,
30 error_info: RXTPRI,
31 request_id: i32,
32 is_last: bool,
33 session_id: u64,
34 ) {
35 }
36 #[allow(clippy::too_many_arguments)]
37 fn on_query_order_by_page(
38 &self,
39 order_info: types::XTPOrderInfo,
40 req_count: i64,
41 order_sequence: i64,
42 query_reference: i64,
43 request_id: i32,
44 is_last: bool,
45 session_id: u64,
46 ) {
47 }
48 fn on_query_trade(
49 &self,
50 trade_info: types::XTPTradeReport,
51 error_info: RXTPRI,
52 request_id: i32,
53 is_last: bool,
54 session_id: u64,
55 ) {
56 }
57 #[allow(clippy::too_many_arguments)]
58 fn on_query_trade_by_page(
59 &self,
60 trade_info: types::XTPTradeReport,
61 req_count: i64,
62 trade_sequence: i64,
63 query_reference: i64,
64 request_id: i32,
65 is_last: bool,
66 session_id: u64,
67 ) {
68 }
69 fn on_query_position(
70 &self,
71 position: types::XTPQueryStkPositionRsp,
72 error_info: RXTPRI,
73 request_id: i32,
74 is_last: bool,
75 session_id: u64,
76 ) {
77 }
78 fn on_query_asset(
79 &self,
80 asset: types::XTPQueryAssetRsp,
81 error_info: RXTPRI,
82 request_id: i32,
83 is_last: bool,
84 session_id: u64,
85 ) {
86 }
87 fn on_query_structured_fund(
88 &self,
89 fund_info: types::XTPStructuredFundInfo,
90 error_info: RXTPRI,
91 request_id: i32,
92 is_last: bool,
93 session_id: u64,
94 ) {
95 }
96 fn on_query_fund_transfer(
97 &self,
98 fund_transfer_info: types::XTPFundTransferNotice,
99 error_info: RXTPRI,
100 request_id: i32,
101 is_last: bool,
102 session_id: u64,
103 ) {
104 }
105 fn on_fund_transfer(
106 &self,
107 fund_transfer_info: types::XTPFundTransferNotice,
108 error_info: RXTPRI,
109 session_id: u64,
110 ) {
111 }
112 fn on_query_etf(
113 &self,
114 etf_info: types::XTPQueryETFBaseRsp,
115 error_info: RXTPRI,
116 request_id: i32,
117 is_last: bool,
118 session_id: u64,
119 ) {
120 }
121 fn on_query_etf_basket(
122 &self,
123 etf_component_info: types::XTPQueryETFComponentRsp,
124 error_info: RXTPRI,
125 request_id: i32,
126 is_last: bool,
127 session_id: u64,
128 ) {
129 }
130 fn on_query_ipo_info_list(
131 &self,
132 ipo_info: types::XTPQueryIPOTickerRsp,
133 error_info: RXTPRI,
134 request_id: i32,
135 is_last: bool,
136 session_id: u64,
137 ) {
138 }
139 fn on_query_ipo_quota_info(
140 &self,
141 quota_info: types::XTPQueryIPOQuotaRsp,
142 error_info: RXTPRI,
143 request_id: i32,
144 is_last: bool,
145 session_id: u64,
146 ) {
147 }
148 fn on_query_option_auction_info(
149 &self,
150 option_info: types::XTPQueryOptionAuctionInfoRsp,
151 error_info: RXTPRI,
152 request_id: i32,
153 is_last: bool,
154 session_id: u64,
155 ) {
156 }
157}
158
159unsafe fn unwrap_trader_spi<'a>(spi: *mut c_void) -> &'a mut dyn TraderSpi {
160 &mut **(spi as *mut *mut dyn TraderSpi)
161}
162
163#[no_mangle]
166pub unsafe extern "C" fn TraderSpiStub_Rust_OnDisconnected(
167 spi: *mut c_void,
168 session_id: u64,
169 reason: c_int,
170) {
171 let spi = unwrap_trader_spi(spi);
172 spi.on_disconnected(session_id, reason as i32);
173}
174
175#[no_mangle]
176pub unsafe extern "C" fn TraderSpiStub_Rust_OnError(spi: *mut c_void, error_info: *const XTPRI) {
177 let spi = unwrap_trader_spi(spi);
178 let error_info = RXTPRI::from_raw(&*error_info);
179 spi.on_error(error_info);
180}
181
182#[no_mangle]
183pub unsafe extern "C" fn TraderSpiStub_Rust_OnOrderEvent(
184 spi: *mut c_void,
185 order_info: *const XTPOrderInfo,
186 error_info: *const XTPRI,
187 session_id: u64,
188) {
189 let spi = unwrap_trader_spi(spi);
190 let order_info = types::XTPOrderInfo::from_raw(&*order_info);
191 let error_info = RXTPRI::from_raw(&*error_info);
192 spi.on_order_event(order_info, error_info, session_id)
193}
194
195#[no_mangle]
196pub unsafe extern "C" fn TraderSpiStub_Rust_OnTradeEvent(
197 spi: *mut c_void,
198 x_trade_info: *const XTPTradeReport,
199 session_id: u64,
200) {
201 let spi = unwrap_trader_spi(spi);
202 let x_trade_info = types::XTPTradeReport::from_raw(&*x_trade_info);
203 spi.on_trade_event(x_trade_info, session_id)
204}
205
206#[no_mangle]
207pub unsafe extern "C" fn TraderSpiStub_Rust_OnCancelOrderError(
208 spi: *mut c_void,
209 cancel_info: *const XTPOrderCancelInfo,
210 error_info: *const XTPRI,
211 session_id: u64,
212) {
213 let spi = unwrap_trader_spi(spi);
214 let cancel_info = types::XTPOrderCancelInfo::from_raw(&*cancel_info);
215 let error_info = RXTPRI::from_raw(&*error_info);
216 spi.on_cancel_order_error(cancel_info, error_info, session_id)
217}
218
219#[no_mangle]
220pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryOrder(
221 spi: *mut c_void,
222 order_info: *const XTPQueryOrderRsp,
223 error_info: *const XTPRI,
224 request_id: c_int,
225 is_last: bool,
226 session_id: u64,
227) {
228 let spi = unwrap_trader_spi(spi);
229 let order_info = types::XTPOrderInfo::from_raw(&*order_info);
230 let error_info = RXTPRI::from_raw(&*error_info);
231 spi.on_query_order(order_info, error_info, request_id, is_last, session_id)
232}
233
234#[no_mangle]
235pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryOrderByPage(
236 spi: *mut c_void,
237 order_info: *const XTPQueryOrderRsp,
238 req_count: i64,
239 order_sequence: i64,
240 query_reference: i64,
241 request_id: c_int,
242 is_last: bool,
243 session_id: u64,
244) {
245 let spi = unwrap_trader_spi(spi);
246 let order_info = types::XTPOrderInfo::from_raw(&*order_info);
247 spi.on_query_order_by_page(
248 order_info,
249 req_count,
250 order_sequence,
251 query_reference,
252 request_id,
253 is_last,
254 session_id,
255 )
256}
257
258#[no_mangle]
259pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryTrade(
260 spi: *mut c_void,
261 trade_info: *const XTPQueryTradeRsp,
262 error_info: *const XTPRI,
263 request_id: c_int,
264 is_last: bool,
265 session_id: u64,
266) {
267 let spi = unwrap_trader_spi(spi);
268 let trade_info = types::XTPTradeReport::from_raw(&*trade_info);
269 let error_info = RXTPRI::from_raw(&*error_info);
270 spi.on_query_trade(trade_info, error_info, request_id, is_last, session_id)
271}
272
273#[no_mangle]
274pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryTradeByPage(
275 spi: *mut c_void,
276 trade_info: *const XTPQueryTradeRsp,
277 req_count: i64,
278 trade_sequence: i64,
279 query_reference: i64,
280 request_id: c_int,
281 is_last: bool,
282 session_id: u64,
283) {
284 let spi = unwrap_trader_spi(spi);
285 let trade_info = types::XTPTradeReport::from_raw(&*trade_info);
286 spi.on_query_trade_by_page(
287 trade_info,
288 req_count,
289 trade_sequence,
290 query_reference,
291 request_id,
292 is_last,
293 session_id,
294 )
295}
296
297#[no_mangle]
298pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryPosition(
299 spi: *mut c_void,
300 position: *const XTPQueryStkPositionRsp,
301 error_info: *const XTPRI,
302 request_id: c_int,
303 is_last: bool,
304 session_id: u64,
305) {
306 let spi = unwrap_trader_spi(spi);
307 let position = types::XTPQueryStkPositionRsp::from_raw(&*position);
308 let error_info = RXTPRI::from_raw(&*error_info);
309 spi.on_query_position(position, error_info, request_id, is_last, session_id)
310}
311
312#[no_mangle]
313pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryAsset(
314 spi: *mut c_void,
315 asset: *const XTPQueryAssetRsp,
316 error_info: *const XTPRI,
317 request_id: c_int,
318 is_last: bool,
319 session_id: u64,
320) {
321 let spi = unwrap_trader_spi(spi);
322 let asset = types::XTPQueryAssetRsp::from_raw(&*asset);
323 let error_info = RXTPRI::from_raw(&*error_info);
324 spi.on_query_asset(asset, error_info, request_id, is_last, session_id)
325}
326
327#[no_mangle]
328pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryStructuredFund(
329 spi: *mut c_void,
330 fund_info: *const XTPStructuredFundInfo,
331 error_info: *const XTPRI,
332 request_id: c_int,
333 is_last: bool,
334 session_id: u64,
335) {
336 let spi = unwrap_trader_spi(spi);
337 let fund_info = types::XTPStructuredFundInfo::from_raw(&*fund_info);
338 let error_info = RXTPRI::from_raw(&*error_info);
339 spi.on_query_structured_fund(fund_info, error_info, request_id, is_last, session_id)
340}
341
342#[no_mangle]
343pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryFundTransfer(
344 spi: *mut c_void,
345 fund_transfer_info: *const XTPFundTransferNotice,
346 error_info: *const XTPRI,
347 request_id: c_int,
348 is_last: bool,
349 session_id: u64,
350) {
351 let spi = unwrap_trader_spi(spi);
352 let fund_transfer_info = types::XTPFundTransferNotice::from_raw(&*fund_transfer_info);
353 let error_info = RXTPRI::from_raw(&*error_info);
354 spi.on_query_fund_transfer(
355 fund_transfer_info,
356 error_info,
357 request_id,
358 is_last,
359 session_id,
360 )
361}
362
363#[no_mangle]
364pub unsafe extern "C" fn TraderSpiStub_Rust_OnFundTransfer(
365 spi: *mut c_void,
366 fund_transfer_info: *const XTPFundTransferNotice,
367 error_info: *const XTPRI,
368 session_id: u64,
369) {
370 let spi = unwrap_trader_spi(spi);
371 let fund_transfer_info = types::XTPFundTransferNotice::from_raw(&*fund_transfer_info);
372 let error_info = RXTPRI::from_raw(&*error_info);
373 spi.on_fund_transfer(fund_transfer_info, error_info, session_id)
374}
375
376#[no_mangle]
377pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryETF(
378 spi: *mut c_void,
379 etf_info: *const XTPQueryETFBaseRsp,
380 error_info: *const XTPRI,
381 request_id: c_int,
382 is_last: bool,
383 session_id: u64,
384) {
385 let spi = unwrap_trader_spi(spi);
386 let etf_info = types::XTPQueryETFBaseRsp::from_raw(&*etf_info);
387 let error_info = RXTPRI::from_raw(&*error_info);
388 spi.on_query_etf(etf_info, error_info, request_id, is_last, session_id)
389}
390
391#[no_mangle]
392pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryETFBasket(
393 spi: *mut c_void,
394 etf_component_info: *const XTPQueryETFComponentRsp,
395 error_info: *const XTPRI,
396 request_id: c_int,
397 is_last: bool,
398 session_id: u64,
399) {
400 let spi = unwrap_trader_spi(spi);
401 let etf_component_info = types::XTPQueryETFComponentRsp::from_raw(&*etf_component_info);
402 let error_info = RXTPRI::from_raw(&*error_info);
403 spi.on_query_etf_basket(
404 etf_component_info,
405 error_info,
406 request_id,
407 is_last,
408 session_id,
409 )
410}
411
412#[no_mangle]
413pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryIPOInfoList(
414 spi: *mut c_void,
415 ipo_info: *const XTPQueryIPOTickerRsp,
416 error_info: *const XTPRI,
417 request_id: c_int,
418 is_last: bool,
419 session_id: u64,
420) {
421 let spi = unwrap_trader_spi(spi);
422 let ipo_info = types::XTPQueryIPOTickerRsp::from_raw(&*ipo_info);
423 let error_info = RXTPRI::from_raw(&*error_info);
424 spi.on_query_ipo_info_list(ipo_info, error_info, request_id, is_last, session_id)
425}
426#[no_mangle]
427pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryIPOQuotaInfo(
428 spi: *mut c_void,
429 quota_info: *const XTPQueryIPOQuotaRsp,
430 error_info: *const XTPRI,
431 request_id: c_int,
432 is_last: bool,
433 session_id: u64,
434) {
435 let spi = unwrap_trader_spi(spi);
436 let quota_info = types::XTPQueryIPOQuotaRsp::from_raw(&*quota_info);
437 let error_info = RXTPRI::from_raw(&*error_info);
438 spi.on_query_ipo_quota_info(quota_info, error_info, request_id, is_last, session_id)
439}
440#[no_mangle]
441pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryOptionAuctionInfo(
442 spi: *mut c_void,
443 option_info: *const XTPQueryOptionAuctionInfoRsp,
444 error_info: *const XTPRI,
445 request_id: c_int,
446 is_last: bool,
447 session_id: u64,
448) {
449 let spi = unwrap_trader_spi(spi);
450 let option_info = types::XTPQueryOptionAuctionInfoRsp::from_raw(&*option_info);
451 let error_info = RXTPRI::from_raw(&*error_info);
452 spi.on_query_option_auction_info(option_info, error_info, request_id, is_last, session_id)
453}
454
455#[no_mangle]
456pub unsafe extern "C" fn TraderSpiStub_Rust_Destructor(spi: *mut c_void) {
457 let spi = spi as *mut Box<dyn TraderSpi>;
458 let _: Box<Box<dyn TraderSpi>> = Box::from_raw(spi);
459}