use std::sync::Arc;
use crate::adapters::alphavantage as av;
use crate::error::Result;
#[derive(Clone, Debug)]
pub struct AlphaVantageHandle {
symbol: Arc<str>,
}
impl AlphaVantageHandle {
pub(crate) fn new(symbol: Arc<str>) -> Self {
Self { symbol }
}
pub fn symbol(&self) -> &str {
&self.symbol
}
pub async fn quote(&self) -> Result<av::GlobalQuote> {
av::global_quote(&self.symbol).await
}
pub async fn intraday(&self, interval: av::AvInterval) -> Result<av::TimeSeries> {
av::time_series_intraday(&self.symbol, interval, None).await
}
pub async fn daily(&self) -> Result<av::TimeSeries> {
av::time_series_daily(&self.symbol, None).await
}
pub async fn daily_adjusted(&self) -> Result<av::AdjustedTimeSeries> {
av::time_series_daily_adjusted(&self.symbol, None).await
}
pub async fn weekly(&self) -> Result<av::TimeSeries> {
av::time_series_weekly(&self.symbol).await
}
pub async fn weekly_adjusted(&self) -> Result<av::AdjustedTimeSeries> {
av::time_series_weekly_adjusted(&self.symbol).await
}
pub async fn monthly(&self) -> Result<av::TimeSeries> {
av::time_series_monthly(&self.symbol).await
}
pub async fn monthly_adjusted(&self) -> Result<av::AdjustedTimeSeries> {
av::time_series_monthly_adjusted(&self.symbol).await
}
pub async fn overview(&self) -> Result<av::CompanyOverview> {
av::company_overview(&self.symbol).await
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn handle_holds_symbol() {
let h = AlphaVantageHandle::new(Arc::from("AAPL"));
assert_eq!(h.symbol(), "AAPL");
}
#[test]
fn handle_clone_is_cheap_arc_clone() {
let h1 = AlphaVantageHandle::new(Arc::from("AAPL"));
let h2 = h1.clone();
assert_eq!(h1.symbol(), h2.symbol());
}
#[allow(dead_code)]
async fn _av_method_signatures_compile(h: &AlphaVantageHandle) {
let _ = h.quote().await;
let _ = h.intraday(av::AvInterval::OneMin).await;
let _ = h.daily().await;
let _ = h.daily_adjusted().await;
let _ = h.weekly().await;
let _ = h.weekly_adjusted().await;
let _ = h.monthly().await;
let _ = h.monthly_adjusted().await;
let _ = h.overview().await;
}
}