use async_trait::async_trait;
use crate::BorsaError;
use paft::domain::{AssetKind, Instrument, Isin};
use paft::fundamentals::analysis::{
Earnings, PriceTarget, RecommendationRow, RecommendationSummary, UpgradeDowngradeRow,
};
use paft::fundamentals::esg::EsgScores;
use paft::fundamentals::holders::{
InsiderRosterHolder, InsiderTransaction, InstitutionalHolder, MajorHolder,
NetSharePurchaseActivity,
};
use paft::fundamentals::profile::Profile;
use paft::fundamentals::statements::{BalanceSheetRow, Calendar, CashflowRow, IncomeStatementRow};
use paft::market::news::NewsArticle;
use paft::market::options::OptionChain;
use paft::market::quote::{Quote, QuoteUpdate};
use paft::market::requests::history::{HistoryRequest, Interval};
use paft::market::requests::news::NewsRequest;
use paft::market::requests::search::SearchRequest;
use paft::market::responses::history::HistoryResponse;
use paft::market::responses::search::SearchResponse;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ConnectorKey(pub &'static str);
impl ConnectorKey {
#[must_use]
pub const fn new(name: &'static str) -> Self {
Self(name)
}
#[must_use]
pub const fn as_str(self) -> &'static str {
self.0
}
}
impl From<ConnectorKey> for &'static str {
fn from(k: ConnectorKey) -> Self {
k.0
}
}
#[async_trait]
pub trait HistoryProvider: Send + Sync {
async fn history(
&self,
instrument: &Instrument,
req: HistoryRequest,
) -> Result<HistoryResponse, BorsaError>;
fn supported_history_intervals(&self, kind: AssetKind) -> &'static [Interval];
}
#[async_trait]
pub trait QuoteProvider: Send + Sync {
async fn quote(&self, instrument: &Instrument) -> Result<Quote, BorsaError>;
}
#[async_trait]
pub trait EarningsProvider: Send + Sync {
async fn earnings(&self, instrument: &Instrument) -> Result<Earnings, BorsaError>;
}
#[async_trait]
pub trait IncomeStatementProvider: Send + Sync {
async fn income_statement(
&self,
instrument: &Instrument,
quarterly: bool,
) -> Result<Vec<IncomeStatementRow>, BorsaError>;
}
#[async_trait]
pub trait BalanceSheetProvider: Send + Sync {
async fn balance_sheet(
&self,
instrument: &Instrument,
quarterly: bool,
) -> Result<Vec<BalanceSheetRow>, BorsaError>;
}
#[async_trait]
pub trait CashflowProvider: Send + Sync {
async fn cashflow(
&self,
instrument: &Instrument,
quarterly: bool,
) -> Result<Vec<CashflowRow>, BorsaError>;
}
#[async_trait]
pub trait CalendarProvider: Send + Sync {
async fn calendar(&self, instrument: &Instrument) -> Result<Calendar, BorsaError>;
}
#[async_trait]
pub trait RecommendationsProvider: Send + Sync {
async fn recommendations(
&self,
instrument: &Instrument,
) -> Result<Vec<RecommendationRow>, BorsaError>;
}
#[async_trait]
pub trait RecommendationsSummaryProvider: Send + Sync {
async fn recommendations_summary(
&self,
instrument: &Instrument,
) -> Result<RecommendationSummary, BorsaError>;
}
#[async_trait]
pub trait UpgradesDowngradesProvider: Send + Sync {
async fn upgrades_downgrades(
&self,
instrument: &Instrument,
) -> Result<Vec<UpgradeDowngradeRow>, BorsaError>;
}
#[async_trait]
pub trait AnalystPriceTargetProvider: Send + Sync {
async fn analyst_price_target(
&self,
instrument: &Instrument,
) -> Result<PriceTarget, BorsaError>;
}
#[async_trait]
pub trait MajorHoldersProvider: Send + Sync {
async fn major_holders(&self, instrument: &Instrument) -> Result<Vec<MajorHolder>, BorsaError>;
}
#[async_trait]
pub trait InstitutionalHoldersProvider: Send + Sync {
async fn institutional_holders(
&self,
instrument: &Instrument,
) -> Result<Vec<InstitutionalHolder>, BorsaError>;
}
#[async_trait]
pub trait MutualFundHoldersProvider: Send + Sync {
async fn mutual_fund_holders(
&self,
instrument: &Instrument,
) -> Result<Vec<InstitutionalHolder>, BorsaError>;
}
#[async_trait]
pub trait InsiderTransactionsProvider: Send + Sync {
async fn insider_transactions(
&self,
instrument: &Instrument,
) -> Result<Vec<InsiderTransaction>, BorsaError>;
}
#[async_trait]
pub trait InsiderRosterHoldersProvider: Send + Sync {
async fn insider_roster_holders(
&self,
instrument: &Instrument,
) -> Result<Vec<InsiderRosterHolder>, BorsaError>;
}
#[async_trait]
pub trait NetSharePurchaseActivityProvider: Send + Sync {
async fn net_share_purchase_activity(
&self,
instrument: &Instrument,
) -> Result<Option<NetSharePurchaseActivity>, BorsaError>;
}
#[async_trait]
pub trait ProfileProvider: Send + Sync {
async fn profile(&self, instrument: &Instrument) -> Result<Profile, BorsaError>;
}
#[async_trait]
pub trait IsinProvider: Send + Sync {
async fn isin(&self, instrument: &Instrument) -> Result<Option<Isin>, BorsaError>;
}
#[async_trait]
pub trait SearchProvider: Send + Sync {
async fn search(&self, req: SearchRequest) -> Result<SearchResponse, BorsaError>;
}
#[async_trait]
pub trait EsgProvider: Send + Sync {
async fn sustainability(&self, instrument: &Instrument) -> Result<EsgScores, BorsaError>;
}
#[async_trait]
pub trait NewsProvider: Send + Sync {
async fn news(
&self,
instrument: &Instrument,
req: NewsRequest,
) -> Result<Vec<NewsArticle>, BorsaError>;
}
#[async_trait]
pub trait StreamProvider: Send + Sync {
async fn stream_quotes(
&self,
instruments: &[Instrument],
) -> Result<
(
crate::stream::StreamHandle,
tokio::sync::mpsc::Receiver<QuoteUpdate>,
),
BorsaError,
>;
}
#[async_trait]
pub trait OptionsExpirationsProvider: Send + Sync {
async fn options_expirations(&self, instrument: &Instrument) -> Result<Vec<i64>, BorsaError>;
}
#[async_trait]
pub trait OptionChainProvider: Send + Sync {
async fn option_chain(
&self,
instrument: &Instrument,
date: Option<i64>,
) -> Result<OptionChain, BorsaError>;
}
#[async_trait]
pub trait BorsaConnector: Send + Sync {
fn name(&self) -> &'static str;
fn vendor(&self) -> &'static str {
"unknown"
}
fn supports_kind(&self, kind: AssetKind) -> bool {
let _ = kind;
false
}
fn as_history_provider(&self) -> Option<&dyn HistoryProvider> {
None
}
fn as_quote_provider(&self) -> Option<&dyn QuoteProvider> {
None
}
fn as_earnings_provider(&self) -> Option<&dyn EarningsProvider> {
None
}
fn as_income_statement_provider(&self) -> Option<&dyn IncomeStatementProvider> {
None
}
fn as_balance_sheet_provider(&self) -> Option<&dyn BalanceSheetProvider> {
None
}
fn as_cashflow_provider(&self) -> Option<&dyn CashflowProvider> {
None
}
fn as_calendar_provider(&self) -> Option<&dyn CalendarProvider> {
None
}
fn as_recommendations_provider(&self) -> Option<&dyn RecommendationsProvider> {
None
}
fn as_recommendations_summary_provider(&self) -> Option<&dyn RecommendationsSummaryProvider> {
None
}
fn as_upgrades_downgrades_provider(&self) -> Option<&dyn UpgradesDowngradesProvider> {
None
}
fn as_analyst_price_target_provider(&self) -> Option<&dyn AnalystPriceTargetProvider> {
None
}
fn as_major_holders_provider(&self) -> Option<&dyn MajorHoldersProvider> {
None
}
fn as_institutional_holders_provider(&self) -> Option<&dyn InstitutionalHoldersProvider> {
None
}
fn as_mutual_fund_holders_provider(&self) -> Option<&dyn MutualFundHoldersProvider> {
None
}
fn as_insider_transactions_provider(&self) -> Option<&dyn InsiderTransactionsProvider> {
None
}
fn as_insider_roster_holders_provider(&self) -> Option<&dyn InsiderRosterHoldersProvider> {
None
}
fn as_net_share_purchase_activity_provider(
&self,
) -> Option<&dyn NetSharePurchaseActivityProvider> {
None
}
fn as_profile_provider(&self) -> Option<&dyn ProfileProvider> {
None
}
fn as_isin_provider(&self) -> Option<&dyn IsinProvider> {
None
}
fn as_search_provider(&self) -> Option<&dyn SearchProvider> {
None
}
fn as_esg_provider(&self) -> Option<&dyn EsgProvider> {
None
}
fn as_news_provider(&self) -> Option<&dyn NewsProvider> {
None
}
fn as_options_expirations_provider(&self) -> Option<&dyn OptionsExpirationsProvider> {
None
}
fn as_option_chain_provider(&self) -> Option<&dyn OptionChainProvider> {
None
}
fn as_stream_provider(&self) -> Option<&dyn StreamProvider> {
None
}
}