1use 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 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(&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 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}