use crate::{
Client, Result,
endpoints::{
EndpointSpec, QueryEncoder, QueryParameters,
metadata::{EndpointMetadata, GeographicAvailability},
},
responses::market_hours::{ExchangeHoliday, ExchangeMarketHours},
types::{Date, ExchangeCode, MarketHoursTimestamp},
};
const WORLDWIDE: EndpointMetadata =
EndpointMetadata::new().with_geography(GeographicAvailability::Worldwide);
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ExchangeMarketHoursQuery {
exchange: ExchangeCode,
timestamp: Option<MarketHoursTimestamp>,
}
impl ExchangeMarketHoursQuery {
pub const fn new(exchange: ExchangeCode) -> Self {
Self {
exchange,
timestamp: None,
}
}
pub fn with_timestamp(mut self, timestamp: MarketHoursTimestamp) -> Self {
self.timestamp = Some(timestamp);
self
}
pub const fn exchange(&self) -> &ExchangeCode {
&self.exchange
}
pub const fn timestamp(&self) -> Option<&MarketHoursTimestamp> {
self.timestamp.as_ref()
}
}
impl From<ExchangeCode> for ExchangeMarketHoursQuery {
fn from(exchange: ExchangeCode) -> Self {
Self::new(exchange)
}
}
impl From<&ExchangeCode> for ExchangeMarketHoursQuery {
fn from(exchange: &ExchangeCode) -> Self {
Self::new(exchange.clone())
}
}
impl QueryParameters for ExchangeMarketHoursQuery {
fn encode(&self, encoder: &mut QueryEncoder<'_>) {
encoder.required("exchange", &self.exchange);
encoder.optional("timestamp", self.timestamp.as_ref());
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct HolidaysByExchangeQuery {
exchange: ExchangeCode,
from: Option<Date>,
to: Option<Date>,
}
impl HolidaysByExchangeQuery {
pub const fn new(exchange: ExchangeCode) -> Self {
Self {
exchange,
from: None,
to: None,
}
}
pub const fn with_from(mut self, from: Date) -> Self {
self.from = Some(from);
self
}
pub const fn with_to(mut self, to: Date) -> Self {
self.to = Some(to);
self
}
pub const fn exchange(&self) -> &ExchangeCode {
&self.exchange
}
pub const fn from(&self) -> Option<Date> {
self.from
}
pub const fn to(&self) -> Option<Date> {
self.to
}
}
impl From<ExchangeCode> for HolidaysByExchangeQuery {
fn from(exchange: ExchangeCode) -> Self {
Self::new(exchange)
}
}
impl From<&ExchangeCode> for HolidaysByExchangeQuery {
fn from(exchange: &ExchangeCode) -> Self {
Self::new(exchange.clone())
}
}
impl QueryParameters for HolidaysByExchangeQuery {
fn encode(&self, encoder: &mut QueryEncoder<'_>) {
encoder.required("exchange", &self.exchange);
encoder.optional("from", self.from);
encoder.optional("to", self.to);
}
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct AllExchangeMarketHoursQuery {
timestamp: Option<MarketHoursTimestamp>,
}
impl AllExchangeMarketHoursQuery {
pub const fn new() -> Self {
Self { timestamp: None }
}
pub fn with_timestamp(mut self, timestamp: MarketHoursTimestamp) -> Self {
self.timestamp = Some(timestamp);
self
}
pub const fn timestamp(&self) -> Option<&MarketHoursTimestamp> {
self.timestamp.as_ref()
}
}
impl QueryParameters for AllExchangeMarketHoursQuery {
fn encode(&self, encoder: &mut QueryEncoder<'_>) {
encoder.optional("timestamp", self.timestamp.as_ref());
}
}
pub fn exchange_market_hours(
query: ExchangeMarketHoursQuery,
) -> EndpointSpec<ExchangeMarketHoursQuery, Vec<ExchangeMarketHours>> {
EndpointSpec::get("exchange-market-hours", "exchange-market-hours", query)
.with_metadata(WORLDWIDE)
}
pub fn holidays_by_exchange(
query: HolidaysByExchangeQuery,
) -> EndpointSpec<HolidaysByExchangeQuery, Vec<ExchangeHoliday>> {
EndpointSpec::get("holidays-by-exchange", "holidays-by-exchange", query)
.with_metadata(WORLDWIDE)
}
pub fn all_exchange_market_hours(
query: AllExchangeMarketHoursQuery,
) -> EndpointSpec<AllExchangeMarketHoursQuery, Vec<ExchangeMarketHours>> {
EndpointSpec::get(
"all-exchange-market-hours",
"all-exchange-market-hours",
query,
)
.with_metadata(WORLDWIDE)
}
impl Client {
pub async fn exchange_market_hours(
&self,
query: impl Into<ExchangeMarketHoursQuery>,
) -> Result<Vec<ExchangeMarketHours>> {
self.execute(&exchange_market_hours(query.into())).await
}
pub async fn holidays_by_exchange(
&self,
query: impl Into<HolidaysByExchangeQuery>,
) -> Result<Vec<ExchangeHoliday>> {
self.execute(&holidays_by_exchange(query.into())).await
}
pub async fn all_exchange_market_hours(
&self,
query: AllExchangeMarketHoursQuery,
) -> Result<Vec<ExchangeMarketHours>> {
self.execute(&all_exchange_market_hours(query)).await
}
}