tradingview/study/
request.rs1use std::time::Duration;
4
5use bon::Builder;
6
7use crate::Result;
8use crate::chart::study::StudyConfiguration;
9use crate::error::TradingViewError;
10use crate::{Interval, MarketSymbol, Ticker};
11
12#[derive(Debug, Clone, Builder)]
14#[builder(on(String, into))]
15pub struct StudyRequest {
16 pub ticker: Option<Ticker>,
18 pub symbol: Option<String>,
20 pub exchange: Option<String>,
22 #[builder(default = Interval::OneDay)]
24 pub interval: Interval,
25 #[builder(default = 100)]
27 pub base_bar_count: u64,
28 #[builder(into)]
30 pub study: StudyConfiguration,
31 pub study_id: Option<String>,
33 #[builder(default = Duration::from_secs(30))]
35 pub timeout: Duration,
36}
37
38impl StudyRequest {
39 pub fn resolve_symbol_exchange(&self) -> Result<(String, String)> {
41 if let Some(ticker) = &self.ticker {
42 return Ok((ticker.symbol().to_string(), ticker.exchange().to_string()));
43 }
44 match (&self.symbol, &self.exchange) {
45 (Some(s), Some(e)) => Ok((s.clone(), e.clone())),
46 (None, _) => Err(TradingViewError::MissingSymbol.into()),
47 (_, None) => Err(TradingViewError::MissingExchange.into()),
48 }
49 }
50}