From 2479c9e529cb1aa880d4fd878ea5b601c2aadca1 Mon Sep 17 00:00:00 2001 From: Vinh Date: Sat, 8 Jul 2023 15:18:27 +0100 Subject: [PATCH] Receive multiple contract details --- crates/ib_tws_core/src/async_client.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/crates/ib_tws_core/src/async_client.rs b/crates/ib_tws_core/src/async_client.rs index 743af1f..59177bd 100644 --- a/crates/ib_tws_core/src/async_client.rs +++ b/crates/ib_tws_core/src/async_client.rs @@ -250,6 +250,29 @@ impl AsyncClient { .unwrap() } + pub async fn request_contract_details_many( + &self, + message: ReqContractDetails, + ) -> Result> + '_, Error> { + let request_id = self.send(Request::ReqContractDetails(message)).await?; + + Ok(self.response_stream_by_id(Some(request_id)) + .take_while(|response| { + let is_end = matches!(response, Response::ContractDataEndMsg(_)); + async move { !is_end } + }) + .filter_map(|response| async move { + match response { + Response::ErrMsgMsg(err) => Some(Err(Error::ApiError(err))), + Response::ContractDataMsg(msg) => Some(Ok(msg.contract_details)), + _ => { + warn!(?response, "unexpected response for request id"); + None + } + } + })) + } + #[instrument(skip(self))] pub async fn request_account_summary( &self,