ferric_fred/
series_data_request.rs1use chrono::NaiveDate;
2
3use crate::{Client, RegionalData, Result, SeriesId};
4
5#[derive(Debug, Clone)]
26#[must_use = "a SeriesDataRequest does nothing until you call `.send()`"]
27pub struct SeriesDataRequest<'a> {
28 client: &'a Client,
29 series_id: SeriesId,
30 date: Option<NaiveDate>,
31 start_date: Option<NaiveDate>,
32}
33
34impl<'a> SeriesDataRequest<'a> {
35 pub(crate) fn new(client: &'a Client, series_id: SeriesId) -> Self {
36 Self {
37 client,
38 series_id,
39 date: None,
40 start_date: None,
41 }
42 }
43
44 pub fn date(mut self, date: NaiveDate) -> Self {
47 self.date = Some(date);
48 self
49 }
50
51 pub fn start_date(mut self, start_date: NaiveDate) -> Self {
53 self.start_date = Some(start_date);
54 self
55 }
56
57 pub async fn send(self) -> Result<RegionalData> {
64 self.client.execute_series_data(&self).await
65 }
66
67 pub(crate) fn query_params(&self) -> Vec<(&'static str, String)> {
70 let mut params: Vec<(&'static str, String)> = Vec::new();
71 params.push(("series_id", self.series_id.as_str().to_owned()));
72 if let Some(date) = self.date {
73 params.push(("date", date.to_string()));
74 }
75 if let Some(start_date) = self.start_date {
76 params.push(("start_date", start_date.to_string()));
77 }
78 params
79 }
80}
81
82#[cfg(test)]
83mod tests {
84 use super::*;
85
86 fn test_client() -> Client {
87 Client::new("test-key").expect("client builds")
88 }
89
90 #[test]
91 fn defaults_send_only_the_series_id() {
92 let client = test_client();
93 let request = client.series_data(&SeriesId::new("SMU56000000500000001"));
94 assert_eq!(
95 request.query_params(),
96 vec![("series_id", "SMU56000000500000001".to_owned())]
97 );
98 }
99
100 #[test]
101 fn date_and_start_date_serialize() {
102 let client = test_client();
103 let request = client
104 .series_data(&SeriesId::new("SMU56000000500000001"))
105 .date(NaiveDate::from_ymd_opt(2013, 1, 1).unwrap())
106 .start_date(NaiveDate::from_ymd_opt(2010, 1, 1).unwrap());
107 let params = request.query_params();
108 for expected in [
109 ("series_id", "SMU56000000500000001"),
110 ("date", "2013-01-01"),
111 ("start_date", "2010-01-01"),
112 ] {
113 assert!(
114 params.contains(&(expected.0, expected.1.to_owned())),
115 "missing {expected:?} in {params:?}"
116 );
117 }
118 }
119}