use super::super::Operation;
use crate::error::Result;
use super::ProviderCore;
#[async_trait::async_trait]
pub trait DiscoveryProvider: ProviderCore {
async fn fetch_symbol_search(
&self,
query: &str,
limit: u32,
) -> Result<Vec<crate::models::discovery::reference::SymbolMatch>>;
async fn fetch_symbol_details(
&self,
_symbol: &str,
) -> Result<crate::models::discovery::reference::SymbolDetails> {
Err(self.not_supported(Operation::SymbolDetails))
}
async fn fetch_exchanges(
&self,
) -> Result<Vec<crate::models::discovery::reference::ExchangeInfo>> {
Err(self.not_supported(Operation::Exchanges))
}
async fn fetch_screener(
&self,
_filters: &crate::models::discovery::reference::ScreenerFilters,
) -> Result<Vec<crate::models::discovery::reference::ScreenerMatch>> {
Err(self.not_supported(Operation::Screener))
}
async fn fetch_listing_status(
&self,
_active: bool,
) -> Result<Vec<crate::models::discovery::reference::SymbolMatch>> {
Err(self.not_supported(Operation::ListingStatus))
}
}
#[async_trait::async_trait]
pub trait CalendarProvider: ProviderCore {
async fn fetch_market_calendar(
&self,
kind: crate::models::calendar::market::CalendarKind,
from: &str,
to: &str,
) -> Result<Vec<crate::models::calendar::market::MarketCalendarEntry>>;
}
#[async_trait::async_trait]
pub trait MarketProvider: ProviderCore {
async fn fetch_market_movers(
&self,
direction: crate::models::market::performance::MoverDirection,
) -> Result<Vec<crate::models::market::performance::MoverQuote>>;
async fn fetch_sector_performance(
&self,
) -> Result<Vec<crate::models::market::performance::SectorPerformance>> {
Err(self.not_supported(Operation::SectorPerformance))
}
async fn fetch_sector_performance_history(
&self,
_limit: u32,
) -> Result<Vec<crate::models::market::performance::SectorPerformanceHistory>> {
Err(self.not_supported(Operation::SectorPerformanceHistory))
}
async fn fetch_sector_pe(&self) -> Result<Vec<crate::models::market::performance::SectorPe>> {
Err(self.not_supported(Operation::SectorPerformance))
}
async fn fetch_industry_pe(
&self,
) -> Result<Vec<crate::models::market::performance::IndustryPe>> {
Err(self.not_supported(Operation::SectorPerformance))
}
}
#[async_trait::async_trait]
pub trait CryptoProvider: ProviderCore {
async fn fetch_crypto_quote(
&self,
id: &str,
vs_currency: &str,
) -> Result<crate::models::crypto::CryptoQuote>;
#[cfg(feature = "defi")]
async fn fetch_protocol_tvl(
&self,
_protocol: &str,
) -> Result<crate::models::crypto::defi::ProtocolTvl> {
Err(self.not_supported(Operation::ProtocolTvl))
}
#[cfg(feature = "defi")]
async fn fetch_protocol_tvl_history(
&self,
_protocol: &str,
) -> Result<Vec<crate::models::crypto::defi::TvlPoint>> {
Err(self.not_supported(Operation::ProtocolTvlHistory))
}
#[cfg(feature = "crypto")]
async fn fetch_crypto_trending(&self) -> Result<Vec<crate::models::crypto::TrendingCoin>> {
Err(self.not_supported(Operation::CryptoTrending))
}
#[cfg(feature = "crypto")]
async fn fetch_crypto_global(&self) -> Result<crate::models::crypto::GlobalCryptoStats> {
Err(self.not_supported(Operation::CryptoGlobal))
}
async fn fetch_crypto_news(
&self,
_limit: u32,
) -> Result<Vec<crate::models::corporate::news::News>> {
Err(self.not_supported(Operation::CryptoNews))
}
}
#[async_trait::async_trait]
pub trait EconomicProvider: ProviderCore {
async fn fetch_economic_series(
&self,
series_id: &str,
) -> Result<crate::models::economic::EconomicSeries>;
async fn fetch_economic_series_as_of(
&self,
_series_id: &str,
_date: &str,
) -> Result<crate::models::economic::EconomicSeries> {
Err(self.not_supported(Operation::EconomicSeriesAsOf))
}
async fn fetch_economic_search(
&self,
_query: &str,
_limit: u32,
) -> Result<Vec<crate::models::economic::EconomicSeriesMatch>> {
Err(self.not_supported(Operation::EconomicSearch))
}
async fn fetch_economic_categories(
&self,
_parent_id: i64,
) -> Result<Vec<crate::models::economic::EconomicCategory>> {
Err(self.not_supported(Operation::EconomicCategories))
}
async fn fetch_economic_releases(
&self,
) -> Result<Vec<crate::models::economic::EconomicRelease>> {
Err(self.not_supported(Operation::EconomicReleases))
}
}
#[async_trait::async_trait]
pub trait ForexProvider: ProviderCore {
async fn fetch_forex_quote(
&self,
from: &str,
to: &str,
) -> Result<crate::models::forex::ForexQuote>;
async fn fetch_forex_news(
&self,
_limit: u32,
) -> Result<Vec<crate::models::corporate::news::News>> {
Err(self.not_supported(Operation::ForexNews))
}
}
#[async_trait::async_trait]
pub trait IndicesProvider: ProviderCore {
async fn fetch_indices_quote(&self, symbol: &str)
-> Result<crate::models::indices::IndexQuote>;
async fn fetch_index_constituents(
&self,
_index: crate::models::indices::MajorIndex,
) -> Result<Vec<crate::models::indices::IndexConstituent>> {
Err(self.not_supported(Operation::IndexConstituents))
}
async fn fetch_index_constituent_changes(
&self,
_index: crate::models::indices::MajorIndex,
) -> Result<Vec<crate::models::indices::IndexConstituentChange>> {
Err(self.not_supported(Operation::IndexConstituentChanges))
}
}
#[async_trait::async_trait]
pub trait FuturesProvider: ProviderCore {
async fn fetch_futures_quote(
&self,
symbol: &str,
) -> Result<crate::models::futures::FuturesQuote>;
#[cfg(feature = "cftc")]
async fn fetch_commitments_of_traders(
&self,
_symbol: &str,
) -> Result<crate::models::futures::cot::CommitmentsOfTraders> {
Err(self.not_supported(Operation::CommitmentsOfTraders))
}
}
#[async_trait::async_trait]
pub trait CommoditiesProvider: ProviderCore {
async fn fetch_commodities_quote(
&self,
symbol: &str,
) -> Result<crate::models::commodities::CommodityQuote>;
}