use std::time::Duration;
use bon::Builder;
use crate::Result;
use crate::chart::study::StudyConfiguration;
use crate::error::TradingViewError;
use crate::{Interval, MarketSymbol, Ticker};
#[derive(Debug, Clone, Builder)]
#[builder(on(String, into))]
pub struct StudyRequest {
pub ticker: Option<Ticker>,
pub symbol: Option<String>,
pub exchange: Option<String>,
#[builder(default = Interval::OneDay)]
pub interval: Interval,
#[builder(default = 100)]
pub base_bar_count: u64,
#[builder(into)]
pub study: StudyConfiguration,
pub study_id: Option<String>,
#[builder(default = Duration::from_secs(30))]
pub timeout: Duration,
}
impl StudyRequest {
pub fn resolve_symbol_exchange(&self) -> Result<(String, String)> {
if let Some(ticker) = &self.ticker {
return Ok((ticker.symbol().to_string(), ticker.exchange().to_string()));
}
match (&self.symbol, &self.exchange) {
(Some(s), Some(e)) => Ok((s.clone(), e.clone())),
(None, _) => Err(TradingViewError::MissingSymbol.into()),
(_, None) => Err(TradingViewError::MissingExchange.into()),
}
}
}