ibapi 5.4.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
//! Common StreamDecoder implementations for WSH module
//!
//! This module contains the StreamDecoder trait implementations that are shared
//! between sync and async versions, avoiding code duplication.

use crate::common::error_helpers;
use crate::common::request_helpers::CancellableOneShot;
use crate::messages::{IncomingMessages, ResponseMessage};
use crate::subscriptions::{DecoderContext, StreamDecoder};
use crate::wsh::*;
use crate::Error;

use super::decoders;

impl StreamDecoder<WshEventData> for WshEventData {
    const RESPONSE_MESSAGE_IDS: &'static [IncomingMessages] = &[IncomingMessages::WshEventData];

    fn decode(_context: &DecoderContext, message: &ResponseMessage) -> Result<Self, Error> {
        decoders::decode_wsh_event_data(message.expect_type(IncomingMessages::WshEventData)?)
    }

    fn cancel_message(_server_version: i32, request_id: Option<i32>, _context: Option<&DecoderContext>) -> Result<Vec<u8>, Error> {
        let request_id = error_helpers::require_request_id_for(request_id, "encode cancel wsh event data message")?;
        super::encoders::encode_cancel_wsh_event_data(request_id)
    }
}

/// The request behind `wsh_metadata`.
pub(crate) enum WshMetadataRequest {}

impl CancellableOneShot for WshMetadataRequest {
    type Proto = crate::proto::WshMetaData;
    type Output = WshMetadata;

    fn decode(payload: Self::Proto) -> Result<WshMetadata, Error> {
        decoders::decode_wsh_metadata_proto(payload)
    }

    fn cancel(request_id: i32) -> Result<Vec<u8>, Error> {
        super::encoders::encode_cancel_wsh_metadata(request_id)
    }
}

/// The by-contract request behind `wsh_event_data`'s `fetch`.
pub(crate) enum WshEventDataRequest {}

impl CancellableOneShot for WshEventDataRequest {
    type Proto = crate::proto::WshEventData;
    type Output = WshEventData;

    fn decode(payload: Self::Proto) -> Result<WshEventData, Error> {
        decoders::decode_wsh_event_data_proto(payload)
    }

    fn cancel(request_id: i32) -> Result<Vec<u8>, Error> {
        super::encoders::encode_cancel_wsh_event_data(request_id)
    }
}