use std::{fmt::Debug, hash::Hash};
use serde::{Deserialize, Serialize};
use crate::{
data::{
batch_indicator::{BatchOhlcvIndicator, WithBatchIndicators},
common::ProfileAggregation,
domain::{
CountryCode, DataBroker, EconomicCategory, EconomicDataSource, EconomicEventImpact,
Exchange, Period, Symbol,
},
event::{EconomicCalendarId, OhlcvId, TpoId, TradesId, VolumeProfileId},
},
error::ChapatyResult,
};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct OhlcvSpotQuery {
pub broker: DataBroker,
pub symbol: Symbol,
pub exchange: Option<Exchange>,
pub period: Period,
pub batch_size: i32,
pub indicators: Vec<BatchOhlcvIndicator>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct OhlcvFutureQuery {
pub broker: DataBroker,
pub symbol: Symbol,
pub exchange: Option<Exchange>,
pub period: Period,
pub batch_size: i32,
pub indicators: Vec<BatchOhlcvIndicator>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
pub struct TradeSpotQuery {
pub broker: DataBroker,
pub symbol: Symbol,
pub exchange: Option<Exchange>,
pub batch_size: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
pub struct TpoSpotQuery {
pub broker: DataBroker,
pub symbol: Symbol,
pub exchange: Option<Exchange>,
pub aggregation: Option<ProfileAggregation>,
pub batch_size: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
pub struct TpoFutureQuery {
pub broker: DataBroker,
pub symbol: Symbol,
pub exchange: Option<Exchange>,
pub aggregation: Option<ProfileAggregation>,
pub batch_size: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
pub struct VolumeProfileSpotQuery {
pub broker: DataBroker,
pub symbol: Symbol,
pub exchange: Option<Exchange>,
pub aggregation: Option<ProfileAggregation>,
pub batch_size: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
pub struct EconomicCalendarQuery {
pub broker: DataBroker,
pub data_source: Option<EconomicDataSource>,
pub country_code: Option<CountryCode>,
pub category: Option<EconomicCategory>,
pub importance: Option<EconomicEventImpact>,
pub batch_size: i32,
}
impl WithBatchIndicators for OhlcvSpotQuery {
type BatchIndicator = BatchOhlcvIndicator;
fn with_indicator(mut self, kind: Self::BatchIndicator) -> Self {
self.indicators.push(kind);
self
}
}
impl WithBatchIndicators for OhlcvFutureQuery {
type BatchIndicator = BatchOhlcvIndicator;
fn with_indicator(mut self, kind: Self::BatchIndicator) -> Self {
self.indicators.push(kind);
self
}
}
pub trait QueryId {
type Id: Copy + PartialEq + Eq + Hash + PartialOrd + Ord + Debug + Send + Sync;
fn to_id(&self) -> ChapatyResult<Self::Id>;
}
impl QueryId for OhlcvSpotQuery {
type Id = OhlcvId;
fn to_id(&self) -> ChapatyResult<Self::Id> {
let exchange = match self.exchange {
Some(ex) => ex,
None => self.broker.try_into()?,
};
Ok(OhlcvId {
broker: self.broker,
exchange,
symbol: self.symbol,
period: self.period,
})
}
}
impl QueryId for OhlcvFutureQuery {
type Id = OhlcvId;
fn to_id(&self) -> ChapatyResult<Self::Id> {
let exchange = match self.exchange {
Some(ex) => ex,
None => self.broker.try_into()?,
};
Ok(OhlcvId {
broker: self.broker,
exchange,
symbol: self.symbol,
period: self.period,
})
}
}
impl QueryId for TradeSpotQuery {
type Id = TradesId;
fn to_id(&self) -> ChapatyResult<Self::Id> {
let exchange = match self.exchange {
Some(ex) => ex,
None => self.broker.try_into()?,
};
Ok(TradesId {
broker: self.broker,
exchange,
symbol: self.symbol,
})
}
}
impl QueryId for TpoSpotQuery {
type Id = TpoId;
fn to_id(&self) -> ChapatyResult<Self::Id> {
let exchange = match self.exchange {
Some(ex) => ex,
None => self.broker.try_into()?,
};
Ok(TpoId {
broker: self.broker,
exchange,
symbol: self.symbol,
aggregation: self.aggregation.unwrap_or_default(),
})
}
}
impl QueryId for TpoFutureQuery {
type Id = TpoId;
fn to_id(&self) -> ChapatyResult<Self::Id> {
let exchange = match self.exchange {
Some(ex) => ex,
None => self.broker.try_into()?,
};
Ok(TpoId {
broker: self.broker,
exchange,
symbol: self.symbol,
aggregation: self.aggregation.unwrap_or_default(),
})
}
}
impl QueryId for VolumeProfileSpotQuery {
type Id = VolumeProfileId;
fn to_id(&self) -> ChapatyResult<Self::Id> {
let exchange = match self.exchange {
Some(ex) => ex,
None => self.broker.try_into()?,
};
Ok(VolumeProfileId {
broker: self.broker,
exchange,
symbol: self.symbol,
aggregation: self.aggregation.unwrap_or_default(),
})
}
}
impl QueryId for EconomicCalendarQuery {
type Id = EconomicCalendarId;
fn to_id(&self) -> ChapatyResult<Self::Id> {
Ok(EconomicCalendarId {
broker: self.broker,
data_source: self.data_source,
country_code: self.country_code,
category: self.category,
importance: self.importance,
})
}
}