ibapi 5.3.0

An unofficial Rust client for the Interactive Brokers TWS API: market data, orders, and account data, with async (Tokio) and blocking clients for TWS and IB Gateway.
Documentation
use time::OffsetDateTime;

pub(in crate::news) fn encode_request_news_providers() -> Result<Vec<u8>, crate::Error> {
    crate::proto::encoders::encode_empty_proto!(NewsProvidersRequest, crate::messages::OutgoingMessages::RequestNewsProviders)
}

pub(in crate::news) fn encode_request_news_bulletins(all_messages: bool) -> Result<Vec<u8>, crate::Error> {
    use crate::messages::{encode_protobuf_message, OutgoingMessages};
    use crate::proto::encoders::some_bool;
    use prost::Message;
    let request = crate::proto::NewsBulletinsRequest {
        all_messages: some_bool(all_messages),
    };
    Ok(encode_protobuf_message(
        OutgoingMessages::RequestNewsBulletins as i32,
        &request.encode_to_vec(),
    ))
}

pub(in crate::news) fn encode_cancel_news_bulletin() -> Result<Vec<u8>, crate::Error> {
    crate::proto::encoders::encode_empty_proto!(CancelNewsBulletins, crate::messages::OutgoingMessages::CancelNewsBulletin)
}

pub(in crate::news) fn encode_request_historical_news(
    request_id: i32,
    contract_id: i32,
    provider_codes: &[&str],
    start_time: OffsetDateTime,
    end_time: OffsetDateTime,
    total_results: u8,
) -> Result<Vec<u8>, crate::Error> {
    use crate::messages::{encode_protobuf_message, OutgoingMessages};
    use crate::ToField;
    use prost::Message;
    let request = crate::proto::HistoricalNewsRequest {
        req_id: Some(request_id),
        con_id: Some(contract_id),
        provider_codes: Some(provider_codes.join("+")),
        start_date_time: Some(start_time.to_field()),
        end_date_time: Some(end_time.to_field()),
        total_results: Some(total_results as i32),
        historical_news_options: Default::default(),
    };
    Ok(encode_protobuf_message(
        OutgoingMessages::RequestHistoricalNews as i32,
        &request.encode_to_vec(),
    ))
}

pub(in crate::news) fn encode_request_news_article(request_id: i32, provider_code: &str, article_id: &str) -> Result<Vec<u8>, crate::Error> {
    use crate::messages::{encode_protobuf_message, OutgoingMessages};
    use prost::Message;
    let request = crate::proto::NewsArticleRequest {
        req_id: Some(request_id),
        provider_code: Some(provider_code.to_string()),
        article_id: Some(article_id.to_string()),
        news_article_options: Default::default(),
    };
    Ok(encode_protobuf_message(
        OutgoingMessages::RequestNewsArticle as i32,
        &request.encode_to_vec(),
    ))
}

/// Encode a contract news market data request.
pub(in crate::news) fn encode_contract_news_request(
    request_id: i32,
    contract: &crate::contracts::Contract,
    provider_codes: &[&str],
) -> Result<Vec<u8>, crate::Error> {
    // `mdoff` plus a `292:<provider>` tick per provider. The encoder borrows
    // `&str`s, so the formatted ticks need an owner.
    let provider_ticks: Vec<String> = provider_codes.iter().map(|provider| format!("292:{provider}")).collect();
    let generic_ticks: Vec<&str> = std::iter::once("mdoff").chain(provider_ticks.iter().map(String::as_str)).collect();
    crate::market_data::realtime::common::encoders::encode_request_market_data(request_id, contract, generic_ticks.as_slice(), false, false)
}

/// Encode a broad tape news market data request.
pub(in crate::news) fn encode_broad_tape_news_request(request_id: i32, provider_code: &str) -> Result<Vec<u8>, crate::Error> {
    let contract = crate::contracts::Contract::news(provider_code);
    let generic_ticks = &["mdoff", "292"];
    crate::market_data::realtime::common::encoders::encode_request_market_data(request_id, &contract, generic_ticks, false, false)
}

// Encoder body assertions live in the migrated sync/async tests via
// `assert_request<B>(builder)`.