ib_tws_core/message/
context.rs

1// Context for Request & Response
2use std::collections::HashMap;
3use std::i32;
4use std::io;
5use std::str;
6
7use bytes::BytesMut;
8
9use super::account::*;
10use super::auth::*;
11use super::bulletins::*;
12use super::constants::*;
13use super::contract::*;
14use super::depth_exchange::*;
15use super::display_group::*;
16use super::err_msg::*;
17use super::execution::*;
18use super::fa::*;
19use super::family_code::*;
20use super::fundamental::*;
21use super::handshake::*;
22use super::head_timestamp::*;
23use super::histogram::*;
24use super::historical::*;
25use super::market::*;
26use super::market_rule::*;
27use super::misc::*;
28use super::news::*;
29use super::order::*;
30use super::portfolio::*;
31use super::position::*;
32use super::request::*;
33use super::reroute::*;
34use super::response::*;
35use super::scanner::*;
36use super::wire::TwsWireDecoder;
37
38#[derive(Debug)]
39pub enum DispatchId {
40    Oneshot(i32),
41    Stream(i32),
42    Global(i32),
43    Multi(i32),
44}
45
46#[derive(Debug)]
47pub struct Context {
48    pub exec_id_to_req_id_map: HashMap<String, i32>,
49    pub server_version: i32,
50    pub extra_auth: bool,
51    pub next_valid_id: i32,
52    pub accounts: String,
53}
54
55impl Context {
56    pub fn new() -> Self {
57        Context {
58            exec_id_to_req_id_map: HashMap::new(),
59            server_version: -1,
60            extra_auth: false,
61            next_valid_id: -1,
62            accounts: "".to_string(),
63        }
64    }
65
66    pub fn server_version(&self) -> i32 {
67        self.server_version
68    }
69
70    pub fn set_server_version(&mut self, version: i32) {
71        self.server_version = version
72    }
73
74    pub fn extra_auth(&self) -> bool {
75        self.extra_auth
76    }
77
78    pub fn is_connect(&self) -> bool {
79        self.next_valid_id > 0
80    }
81
82    pub fn set_extra_auth(&mut self, extra_auth: bool) {
83        self.extra_auth = extra_auth
84    }
85
86    pub fn register_request(&mut self, request: &Request) {}
87
88    pub fn process_response(&mut self, response: &Response) {}
89
90    pub fn register(&mut self, req_id: i32, exec_id: &str) {
91        self.exec_id_to_req_id_map
92            .insert(exec_id.to_string(), req_id);
93    }
94
95    pub fn unregister(&mut self, req_id: i32) {}
96
97    pub fn get_req_id(&self, exec_id: &str) -> Option<i32> {
98        self.exec_id_to_req_id_map.get(exec_id).copied()
99    }
100
101    pub fn encode_message(&mut self, req: &Request) -> Result<BytesMut, io::Error> {
102        let mut buf = BytesMut::new();
103        let request = match req {
104            Request::Handshake(ref req) => encode_handshake(self, &mut buf, req),
105            Request::StartApi(ref req) => encode_start_api(self, &mut buf, req),
106            Request::CancelScannerSubscription(ref req) => {
107                encode_cancel_scanner_subscription(self, &mut buf, req)
108            }
109
110            Request::ReqScannerParameters(ref req) => {
111                encode_req_scanner_parameters(self, &mut buf, req)
112            }
113
114            Request::ReqScannerSubscription(ref req) => {
115                encode_req_scanner_subscription(self, &mut buf, req)
116            }
117
118            Request::ReqMktData(ref req) => encode_req_mkt_data(self, &mut buf, req),
119            Request::CancelHistoricalData(ref req) => {
120                encode_cancel_historical_data(self, &mut buf, req)
121            }
122            Request::CancelRealtimeBars(ref req) => {
123                encode_cancel_realtime_bars(self, &mut buf, req)
124            }
125            Request::ReqHistoricalData(ref req) => encode_req_historical_data(self, &mut buf, req),
126            Request::ReqHeadTimestamp(ref req) => encode_req_head_timestamp(self, &mut buf, req),
127            Request::CancelHeadTimestamp(ref req) => {
128                encode_cancel_head_timestamp(self, &mut buf, req)
129            }
130            Request::ReqRealtimeBars(ref req) => encode_req_realtime_bars(self, &mut buf, req),
131            Request::ReqContractDetails(ref req) => {
132                encode_req_contract_details(self, &mut buf, req)
133            }
134            Request::ReqMktDepth(ref req) => encode_req_mkt_depth(self, &mut buf, req),
135            Request::CancelMktData(ref req) => encode_cancel_mkt_data(self, &mut buf, req),
136            Request::CancelMktDepth(ref req) => encode_cancel_mkt_depth(self, &mut buf, req),
137            Request::ExerciseOptions(ref req) => encode_exercise_options(self, &mut buf, req),
138            Request::PlaceOrder(ref req) => encode_place_order(self, &mut buf, req),
139            Request::ReqAccountUpdates(ref req) => encode_req_account_updates(self, &mut buf, req),
140            Request::ReqExecutions(ref req) => encode_req_executions(self, &mut buf, req),
141            Request::CancelOrder(ref req) => encode_cancel_order(self, &mut buf, req),
142            Request::ReqOpenOrders(ref req) => encode_req_open_orders(self, &mut buf, req),
143            Request::ReqIds(ref req) => encode_req_ids(self, &mut buf, req),
144            Request::ReqNewsBulletins(ref req) => encode_req_news_bulletins(self, &mut buf, req),
145            Request::CancelNewsBulletins(ref req) => {
146                encode_cancel_news_bulletins(self, &mut buf, req)
147            }
148            Request::SetServerLogLevel(ref req) => encode_set_server_log_level(self, &mut buf, req),
149            Request::ReqAutoOpenOrders(ref req) => encode_req_auto_open_orders(self, &mut buf, req),
150            Request::ReqAllOpenOrders(ref req) => encode_req_all_open_orders(self, &mut buf, req),
151            Request::ReqManagedAccts(ref req) => encode_req_managed_accts(self, &mut buf, req),
152            Request::RequestFA(ref req) => encode_request_fa(self, &mut buf, req),
153            Request::ReplaceFA(ref req) => encode_replace_fa(self, &mut buf, req),
154            Request::ReqCurrentTime(ref req) => encode_req_current_time(self, &mut buf, req),
155            Request::ReqFundamentalData(ref req) => {
156                encode_req_fundamental_data(self, &mut buf, req)
157            }
158            Request::CancelFundamentalData(ref req) => {
159                encode_cancel_fundamental_data(self, &mut buf, req)
160            }
161            Request::CalculateImpliedVolatility(ref req) => {
162                encode_calculate_implied_volatility(self, &mut buf, req)
163            }
164            Request::CancelCalculateImpliedVolatility(ref req) => {
165                encode_cancel_calculate_implied_volatility(self, &mut buf, req)
166            }
167            Request::CalculateOptionPrice(ref req) => {
168                encode_calculate_option_price(self, &mut buf, req)
169            }
170            Request::CancelCalculateOptionPrice(ref req) => {
171                encode_cancel_calculate_option_price(self, &mut buf, req)
172            }
173            Request::ReqGlobalCancel(ref req) => encode_req_global_cancel(self, &mut buf, req),
174            Request::ReqMarketDataType(ref req) => encode_req_market_data_type(self, &mut buf, req),
175            Request::ReqPositions(ref req) => encode_req_positions(self, &mut buf, req),
176            Request::ReqSecDefOptParams(ref req) => {
177                encode_req_sec_def_opt_params(self, &mut buf, req)
178            }
179            Request::ReqSoftDollarTiers(ref req) => {
180                encode_req_soft_dollar_tiers(self, &mut buf, req)
181            }
182            Request::CancelPositions(ref req) => encode_cancel_positions(self, &mut buf, req),
183            Request::ReqPositionsMulti(ref req) => encode_req_positions_multi(self, &mut buf, req),
184            Request::CancelPositionsMulti(ref req) => {
185                encode_cancel_positions_multi(self, &mut buf, req)
186            }
187            Request::CancelAccountUpdatesMulti(ref req) => {
188                encode_cancel_account_updates_multi(self, &mut buf, req)
189            }
190            Request::ReqAccountUpdatesMulti(ref req) => {
191                encode_req_account_updates_multi(self, &mut buf, req)
192            }
193            Request::ReqAccountSummary(ref req) => encode_req_account_summary(self, &mut buf, req),
194            Request::CancelAccountSummary(ref req) => {
195                encode_cancel_account_summary(self, &mut buf, req)
196            }
197            Request::VerifyRequest(ref req) => encode_verify_request(self, &mut buf, req),
198            Request::VerifyMessage(ref req) => encode_verify_message(self, &mut buf, req),
199            Request::VerfyAndAuthRequest(ref req) => {
200                encode_verify_and_auth_request(self, &mut buf, req)
201            }
202            Request::VerifyAndAuthMessage(ref req) => {
203                encode_verify_and_auth_message(self, &mut buf, req)
204            }
205            Request::QueryDisplayGroups(ref req) => {
206                encode_query_display_groups(self, &mut buf, req)
207            }
208            Request::SubscribeToGroupEvents(ref req) => {
209                encode_subscribe_to_group_event(self, &mut buf, req)
210            }
211            Request::UpdateDisplayGroup(ref req) => {
212                encode_update_display_group(self, &mut buf, req)
213            }
214            Request::UnsubscribeFromGroupEvents(ref req) => {
215                encode_unsubscribe_from_group_events(self, &mut buf, req)
216            }
217            Request::MatchingSymbol(ref req) => encode_matching_symbol(self, &mut buf, req),
218            Request::ReqFamilyCodes(ref req) => encode_req_family_codes(self, &mut buf, req),
219            Request::ReqMktDepthExchanges(ref req) => {
220                encode_req_mkt_depth_exchanges(self, &mut buf, req)
221            }
222            Request::ReqSmartComponents(ref req) => {
223                encode_req_smart_components(self, &mut buf, req)
224            }
225            Request::ReqNewsProvider(ref req) => encode_req_news_provider(self, &mut buf, req),
226            Request::ReqNewsArticle(ref req) => encode_req_news_article(self, &mut buf, req),
227            Request::ReqHistoricalNews(ref req) => encode_req_historical_news(self, &mut buf, req),
228            Request::ReqHistogramData(ref req) => encode_req_histogram_data(self, &mut buf, req),
229            Request::CancelHistogramData(ref req) => {
230                encode_cancel_histogram_data(self, &mut buf, req)
231            }
232            Request::ReqMarketRule(ref req) => encode_req_market_rule(self, &mut buf, req),
233            Request::ReqPnl(ref req) => encode_req_pnl(self, &mut buf, req),
234            Request::CancelPnl(ref req) => encode_cancel_pnl(self, &mut buf, req),
235            Request::ReqPnlSingle(ref req) => encode_req_pnl_single(self, &mut buf, req),
236            Request::CancelPnlSingle(ref req) => encode_cancel_pnl_single(self, &mut buf, req),
237            Request::ReqHistoricalTicks(ref req) => {
238                encode_req_historical_ticks(self, &mut buf, req)
239            }
240            Request::ReqTickByTickData(ref req) => {
241                encode_req_tick_by_tick_data(self, &mut buf, req)
242            }
243            Request::CancelTickByTickData(ref req) => {
244                encode_cancel_tick_by_tick_data(self, &mut buf, req)
245            }
246        };
247
248        //println!("request {:?}\n buf:{:?}", request, buf);
249        match request {
250            Ok(_) => Ok(buf),
251            Err(_) => Err(io::Error::new(io::ErrorKind::Other, "encoder error")),
252        }
253    }
254
255    #[instrument(skip(self, buf), err)]
256    pub fn decode_message(&mut self, buf: &mut BytesMut) -> Result<Response, io::Error> {
257        let (response, _id) = self.parse_message(buf)?;
258        Ok(response)
259    }
260
261    /*pub fn parse_message_warp(&mut self, buf: &mut BytesMut) -> Result<(Response, i32), io::Error> {
262        let result = self.parse_message(buf);
263
264        match result {
265            Err(ref e) => {
266                println!("parse_message error:{:?}", e);
267            }
268            _ => {}
269        }
270        result
271    }*/
272
273    pub fn parse_message(&mut self, buf: &mut BytesMut) -> Result<(Response, i32), io::Error> {
274        if self.server_version < 0 {
275            let ack = decode_handshake_ack(self, buf)?;
276            self.server_version = ack.server_version;
277            Ok((Response::HandshakeAck(ack), OPCODE_HANDSHAKE))
278        } else {
279            let msg_id = buf.read_int()?;
280            //println!("msg_id: {}", msg_id);
281            let result = match msg_id {
282                TICK_PRICE => decode_tick_price_msg(self, buf)?,
283                TICK_SIZE => decode_tick_size_msg(self, buf)?,
284                ORDER_STATUS => decode_order_status_msg(self, buf)?,
285                ERR_MSG => decode_err_msg(self, buf)?,
286                OPEN_ORDER => decode_open_order_end_msg(self, buf)?,
287                ACCT_VALUE => decode_acct_value_msg(self, buf)?,
288                PORTFOLIO_VALUE => decode_portfolio_value_msg(self, buf)?,
289                ACCT_UPDATE_TIME => decode_acct_update_time_msg(self, buf)?,
290                NEXT_VALID_ID => {
291                    let response = decode_next_valid_id_msg(self, buf)?;
292                    if let Response::NextValidIdMsg(ref msg) = response.0 {
293                        self.next_valid_id = msg.order_id;
294                    }
295                    response
296                }
297                CONTRACT_DATA => decode_contract_data_msg(self, buf)?,
298                EXECUTION_DATA => decode_execution_data_msg(self, buf)?,
299                MARKET_DEPTH => decode_market_depth_msg(self, buf)?,
300                MARKET_DEPTH_L2 => decode_market_depth_l2_msg(self, buf)?,
301                NEWS_BULLETINS => decode_news_bulletins_msg(self, buf)?,
302                MANAGED_ACCTS => {
303                    let response = decode_managed_accts_msg(self, buf)?;
304                    if let Response::ManagedAcctsMsg(ref msg) = response.0 {
305                        self.accounts = msg.accounts.clone();
306                    }
307                    response
308                }
309                RECEIVE_FA => decode_receive_fa_msg(self, buf)?,
310                HISTORICAL_DATA => decode_historical_data_msg(self, buf)?,
311                BOND_CONTRACT_DATA => decode_bond_contract_data_msg(self, buf)?,
312                SCANNER_PARAMETERS => decode_scanner_parameters_msg(self, buf)?,
313                SCANNER_DATA => decode_scanner_data_msg(self, buf)?,
314                TICK_OPTION_COMPUTATION => decode_tick_option_computation_msg(self, buf)?,
315                TICK_GENERIC => decode_tick_generic_msg(self, buf)?,
316                TICK_STRING => decode_tick_string_msg(self, buf)?,
317                TICK_EFP => decode_tick_efp_msg(self, buf)?,
318                CURRENT_TIME => decode_current_time_msg(self, buf)?,
319                REAL_TIME_BARS => decode_realtime_bars_msg(self, buf)?,
320                FUNDAMENTAL_DATA => decode_fundamental_data_msg(self, buf)?,
321                CONTRACT_DATA_END => decode_contract_data_end_msg(self, buf)?,
322                OPEN_ORDER_END => decode_open_order_end_msg(self, buf)?,
323                ACCT_DOWNLOAD_END => decode_acct_download_end_msg(self, buf)?,
324                EXECUTION_DATA_END => decode_execution_data_end_msg(self, buf)?,
325                DELTA_NEUTRAL_VALIDATION => decode_delta_neutral_validation_msg(self, buf)?,
326                TICK_SNAPSHOT_END => decode_tick_snapshot_end_msg(self, buf)?,
327                MARKET_DATA_TYPE => decode_market_data_type_msg(self, buf)?,
328                COMMISSION_REPORT => decode_commission_report_msg(self, buf)?,
329                POSITION => decode_position_msg(self, buf)?,
330                POSITION_END => decode_position_end_msg(self, buf)?,
331                ACCOUNT_SUMMARY => decode_account_summary_msg(self, buf)?,
332                ACCOUNT_SUMMARY_END => decode_account_summary_end_msg(self, buf)?,
333                VERIFY_MESSAGE_API => decode_verify_message_api_msg(self, buf)?,
334                VERIFY_COMPLETED => decode_verify_completed_msg(self, buf)?,
335                DISPLAY_GROUP_LIST => decode_display_group_list_msg(self, buf)?,
336                DISPLAY_GROUP_UPDATED => decode_display_group_updated_msg(self, buf)?,
337                VERIFY_AND_AUTH_MESSAGE_API => decode_verify_and_auth_message_msg(self, buf)?,
338                VERIFY_AND_AUTH_COMPLETED => decode_verify_and_auth_completed_msg(self, buf)?,
339                POSITION_MULTI => decode_position_multi_msg(self, buf)?,
340                POSITION_MULTI_END => decode_position_multi_end_msg(self, buf)?,
341                ACCOUNT_UPDATE_MULTI => decode_account_update_multi_msg(self, buf)?,
342                ACCOUNT_UPDATE_MULTI_END => decode_account_update_multi_end_msg(self, buf)?,
343                SECURITY_DEFINITION_OPTION_PARAMETER => {
344                    decode_security_definition_optional_parameter_msg(self, buf)?
345                }
346                SECURITY_DEFINITION_OPTION_PARAMETER_END => {
347                    decode_security_definition_optional_parameter_end_msg(self, buf)?
348                }
349                SOFT_DOLLAR_TIERS => decode_soft_dollar_tiers_msg(self, buf)?,
350                FAMILY_CODES => decode_family_codes_msg(self, buf)?,
351                SYMBOL_SAMPLES => decode_symbol_sample_msg(self, buf)?,
352                MKT_DEPTH_EXCHANGES => decode_mkt_depth_exchanges_msg(self, buf)?,
353                TICK_REQ_PARAMS => decode_tick_req_params_msg(self, buf)?,
354                SMART_COMPONENTS => decode_smart_components_msg(self, buf)?,
355                NEWS_ARTICLE => decode_news_article_msg(self, buf)?,
356                TICK_NEWS => decode_tick_news_msg(self, buf)?,
357                NEWS_PROVIDERS => decode_news_providers_msg(self, buf)?,
358                HISTORICAL_NEWS => decode_historical_news_msg(self, buf)?,
359                HISTORICAL_NEWS_END => decode_historical_news_end_msg(self, buf)?,
360                HEAD_TIMESTAMP => decode_head_timestamp_msg(self, buf)?,
361                HISTOGRAM_DATA => decode_historical_data_msg(self, buf)?,
362                HISTORICAL_DATA_UPDATE => decode_historical_data_update_msg(self, buf)?,
363                REROUTE_MKT_DATA_REQ => decode_reroute_mkt_data_req(self, buf)?,
364                REROUTE_MKT_DEPTH_REQ => decode_reroute_mkt_depth_req(self, buf)?,
365                MARKET_RULE => decode_market_rule(self, buf)?,
366                PNL => decode_pnl_msg(self, buf)?,
367                PNL_SINGLE => decode_pnl_single_msg(self, buf)?,
368                HISTORICAL_TICKS => decode_historical_ticks(self, buf)?,
369                HISTORICAL_TICKS_BID_ASK => decode_historical_ticks_bid_ask(self, buf)?,
370                HISTORICAL_TICKS_LAST => decode_historical_ticks_last(self, buf)?,
371                TICK_BY_TICK => decode_tick_by_tick_msg(self, buf)?,
372                _ => {
373                    return Err(io::Error::new(
374                        io::ErrorKind::InvalidData,
375                        format!("unknown message id {}", msg_id),
376                    ))
377                }
378            };
379            Ok(result)
380        }
381    }
382}