use crate::client::ids::RequestId;
use crate::contracts::{Contract, ContractDetails};
use crate::Error;
#[must_use = "ContractDetailsBuilder does nothing until you call .subscribe()"]
pub struct ContractDetailsBuilder<'a, C> {
client: &'a C,
contract: &'a Contract,
request_id: RequestId,
buffer_limit: Option<usize>,
}
impl<'a, C> ContractDetailsBuilder<'a, C> {
pub(crate) fn new(client: &'a C, contract: &'a Contract, request_id: RequestId) -> Self {
Self {
client,
contract,
request_id,
buffer_limit: None,
}
}
pub fn request_id(&self) -> i32 {
self.request_id.raw()
}
#[cfg_attr(
feature = "sync",
doc = r#"
```no_run
use ibapi::client::blocking::Client;
use ibapi::contracts::Contract;
use ibapi::Error;
let client = Client::connect("127.0.0.1:4002", 100).expect("connection failed");
let contract = Contract::stock("AAPL").build();
let subscription = client.contract_details_stream(&contract).buffer_limit(64).subscribe().expect("request failed");
for details in subscription.iter_data() {
match details {
Ok(details) => println!("{}", details.contract.contract_id),
Err(Error::BufferLimitExceeded { limit }) => eprintln!("fell {limit} rows behind; stopping"),
Err(e) => eprintln!("error: {e}"),
}
}
```
"#
)]
#[cfg_attr(
feature = "async",
doc = r#"
```no_run
use ibapi::prelude::*;
use ibapi::Error;
#[tokio::main]
async fn main() {
let client = Client::connect("127.0.0.1:4002", 100).await.expect("connection failed");
let contract = Contract::stock("AAPL").build();
let subscription = client.contract_details_stream(&contract).buffer_limit(64).subscribe().await.expect("request failed");
let mut details = subscription.filter_data();
while let Some(details) = details.next().await {
match details {
Ok(details) => println!("{}", details.contract.contract_id),
Err(Error::BufferLimitExceeded { limit }) => eprintln!("fell {limit} rows behind; stopping"),
Err(e) => eprintln!("error: {e}"),
}
}
}
```
"#
)]
pub fn buffer_limit(mut self, limit: usize) -> Self {
self.buffer_limit = Some(limit);
self
}
}
#[cfg(feature = "sync")]
impl<'a> ContractDetailsBuilder<'a, crate::client::sync::Client> {
pub fn subscribe(self) -> Result<crate::subscriptions::sync::Subscription<ContractDetails>, Error> {
crate::contracts::sync::contract_details_stream(self.client, self.contract, self.request_id, self.buffer_limit)
}
}
#[cfg(feature = "async")]
impl<'a> ContractDetailsBuilder<'a, crate::client::r#async::Client> {
pub async fn subscribe(self) -> Result<crate::subscriptions::r#async::Subscription<ContractDetails>, Error> {
crate::contracts::r#async::contract_details_stream(self.client, self.contract, self.request_id, self.buffer_limit).await
}
}