use time::Date;
use crate::client::sync::Client;
use crate::subscriptions::sync::Subscription;
use crate::{
common::request_helpers,
protocol::{check_version, Features},
Error,
};
use super::{common::decoders, encoders, AutoFill, WshEventData, WshMetadata};
impl Client {
pub fn wsh_metadata(&self) -> Result<WshMetadata, Error> {
check_version(self.server_version, Features::WSHE_CALENDAR)?;
request_helpers::blocking::one_shot_request_with_retry(self, encoders::encode_request_wsh_metadata, decoders::decode_metadata_message, || {
Err(Error::UnexpectedEndOfStream)
})
}
pub fn wsh_event_data_by_contract(
&self,
contract_id: i32,
start_date: Option<Date>,
end_date: Option<Date>,
limit: Option<i32>,
auto_fill: Option<AutoFill>,
) -> Result<WshEventData, Error> {
check_version(self.server_version, Features::WSHE_CALENDAR)?;
if auto_fill.is_some() {
check_version(self.server_version, Features::WSH_EVENT_DATA_FILTERS)?;
}
if start_date.is_some() || end_date.is_some() || limit.is_some() {
check_version(self.server_version, Features::WSH_EVENT_DATA_FILTERS_DATE)?;
}
request_helpers::blocking::one_shot_request_with_retry(
self,
|request_id| encoders::encode_request_wsh_event_data(request_id, Some(contract_id), None, start_date, end_date, limit, auto_fill),
decoders::decode_event_data_message,
|| Err(Error::UnexpectedEndOfStream),
)
}
pub fn wsh_event_data_by_filter(
&self,
filter: &str,
limit: Option<i32>,
auto_fill: Option<AutoFill>,
) -> Result<Subscription<WshEventData>, Error> {
if limit.is_some() {
check_version(self.server_version, Features::WSH_EVENT_DATA_FILTERS_DATE)?;
}
request_helpers::blocking::request_with_id(self, Features::WSH_EVENT_DATA_FILTERS, |request_id| {
encoders::encode_request_wsh_event_data(
request_id,
None,
Some(filter),
None, None, limit,
auto_fill,
)
})
}
}
#[cfg(test)]
#[path = "sync_tests.rs"]
mod tests;