fred_rs/releases/
mod.rs

1//! Get all releases of economic data
2//! 
3//! [https://research.stlouisfed.org/docs/api/fred/releases.html](https://research.stlouisfed.org/docs/api/fred/releases.html)
4//! 
5//! ```
6//! use fred_rs::client::FredClient;
7//! use fred_rs::releases::{Builder, SortOrder, OrderBy};
8//! use fred_rs::release::Response;
9//! 
10//! let mut c = match FredClient::new() {
11//! Ok(c) => c,
12//!     Err(msg) => {
13//!         println!("{}", msg);
14//!         assert_eq!(2, 1);
15//!         return
16//!     },
17//! };
18//! 
19//! let mut builder = Builder::new();
20//! builder
21//!     .limit(5)
22//!     .sort_order(SortOrder::Ascending)
23//!     .order_by(OrderBy::ReleaseId);
24//! 
25//! let resp: Response = match c.releases(Some(builder)) {
26//! Ok(resp) => resp,
27//! Err(msg) => {
28//!     println!("{}", msg);
29//!     assert_eq!(2, 1);
30//!     return
31//!     },
32//! };
33//! 
34//! for item in resp.releases {
35//!     println!("{}: {}", item.id, item.name);
36//! }
37//! ```
38
39pub mod dates;
40
41// -----------------------------------------------------------------------------
42
43/// Determines the order of search results
44/// 
45/// [https://research.stlouisfed.org/docs/api/fred/releases.html#order_by](https://research.stlouisfed.org/docs/api/fred/releases.html#order_by)
46pub enum OrderBy {
47    /// Default
48    ReleaseId,
49    Name,
50    PressRelease,
51    RealtimeStart,
52    RealtimeEnd,
53}
54
55/// Sort order options for the fred/releases endpoint
56/// 
57/// [https://research.stlouisfed.org/docs/api/fred/releases.html#sort_order](https://research.stlouisfed.org/docs/api/fred/releases.html#sort_order)
58pub enum SortOrder {
59    /// Dates returned in ascending order (default)
60    Ascending,    
61    /// Dates returned in descending order
62    Descending,   
63}
64
65pub struct Builder {
66    option_string: String
67}
68
69impl Builder {
70
71    /// Initializes a new releases::Builder that can be used to add commands to an API request
72    /// 
73    /// The builder does not do validity checking of the arguments nor does it check for duplicates.
74    /// 
75    /// ```
76    /// use fred_rs::releases::Builder;
77    /// // Create a new builder
78    /// let mut builder = Builder::new();
79    /// // add arguments to the builder
80    /// builder
81    ///     .realtime_start("1900-01-01")
82    ///     .realtime_end("2000-01-01");
83    /// ```
84    pub fn new() -> Builder {
85        Builder {
86            option_string: String::new(),
87        }
88    }
89
90    /// Returns the current arguments as a URL formatted string
91    pub(crate) fn build(self) -> String {
92        self.option_string
93    }
94
95    /// Adds a realtime_start argument to the builder
96    /// 
97    /// # Arguments
98    /// * `start_date` - date formatted as YYYY-MM-DD
99    /// 
100    /// [https://research.stlouisfed.org/docs/api/fred/releases.html#realtime_start](https://research.stlouisfed.org/docs/api/fred/releases.html#realtime_start)
101    pub fn realtime_start(&mut self, start_date: &str) -> &mut Builder {
102        self.option_string += format!("&realtime_start={}", start_date).as_str();
103        self
104    }
105
106    /// Adds a realtime_end argument to the builder
107    /// 
108    /// # Arguments
109    /// * `end_date` - date formatted as YYYY-MM-DD
110    /// 
111    /// [https://research.stlouisfed.org/docs/api/fred/releases.html#realtime_end](https://research.stlouisfed.org/docs/api/fred/releases.html#realtime_end)
112    pub fn realtime_end(&mut self, end_date: &str) -> &mut Builder {
113        self.option_string += format!("&realtime_end={}", end_date).as_str();
114        self
115    }
116
117    /// Adds a limit argument to the builder
118    /// 
119    /// The limit argument specifies a maximum number of observations to return.
120    /// 
121    /// # Arguments
122    /// * `num_results` - Maximum number of results to return
123    /// 
124    /// [https://research.stlouisfed.org/docs/api/fred/releases.html#limit](https://research.stlouisfed.org/docs/api/fred/releases.html#limit)
125    pub fn limit(&mut self, num_results: usize) -> &mut Builder {
126        let num_results = if num_results > 1000 { // max value is 1000
127            1000
128        } else {
129            num_results
130        };
131        self.option_string += format!("&limit={}", num_results).as_str();
132        self
133    }
134
135    /// Adds an offset argument to the builder
136    /// 
137    /// Adding an offset shifts the starting result number.  For example, if limit is 5 and offset is 0 then results 1-5 will be returned, but if offset was 5 then results 6-10 would be returned.
138    /// 
139    /// # Arguments
140    /// * `ofs` - the offset amount
141    /// 
142    /// [https://research.stlouisfed.org/docs/api/fred/releases.html#offset](https://research.stlouisfed.org/docs/api/fred/releases.html#offset)
143    pub fn offset(&mut self, ofs: usize) -> &mut Builder {
144        self.option_string += format!("&offset={}", ofs).as_str();
145        self
146    }
147
148    /// Adds the search_type argument to the request
149    /// 
150    /// # Arguments
151    /// * `order` - result ranking system
152    /// 
153    /// [https://research.stlouisfed.org/docs/api/fred/releases.html#order_by](https://research.stlouisfed.org/docs/api/fred/releases.html#order_by)
154    pub fn order_by(&mut self, order: OrderBy) -> &mut Builder {
155        match order {
156            OrderBy::ReleaseId => {
157                self.option_string += "&order_by=release_id";
158            },
159            OrderBy::Name => {
160                self.option_string += "&order_by=name";
161            },
162            OrderBy::PressRelease => {
163                self.option_string += "&order_by=press_release";
164            },
165            OrderBy::RealtimeStart => {
166                self.option_string += "&order_by=realtime_start";
167            },
168            OrderBy::RealtimeEnd => {
169                self.option_string += "&order_by=realtime_end";
170            },
171        };
172        self
173    }
174
175    /// Change the sort order of the data
176    /// 
177    /// # Arguments
178    /// * `order` - Data sort order enum
179    /// 
180    /// [https://research.stlouisfed.org/docs/api/fred/releases.html#sort_order](https://research.stlouisfed.org/docs/api/fred/releases.html#sort_order)
181    pub fn sort_order(&mut self, order: SortOrder) -> &mut Builder {
182        match order {
183            SortOrder::Descending => {
184                self.option_string += format!("&sort_order=desc").as_str()
185            },
186            _ => () // ASC is the default so do nothing
187        }
188        self
189    }
190}
191
192#[cfg(test)]
193mod tests {
194    use super::*;
195    use crate::release::Response;
196    use crate::client::FredClient;
197
198    #[test]
199    fn releases_with_options() {
200        let mut c = match FredClient::new() {
201            Ok(c) => c,
202            Err(msg) => {
203                println!("{}", msg);
204                assert_eq!(2, 1);
205                return
206            },
207        };
208
209        let mut builder = Builder::new();
210        builder
211            .limit(5)
212            .sort_order(SortOrder::Ascending)
213            .order_by(OrderBy::ReleaseId);
214
215        let resp: Response = match c.releases(Some(builder)) {
216            Ok(resp) => resp,
217            Err(msg) => {
218                println!("{}", msg);
219                assert_eq!(2, 1);
220                return
221            },
222        };
223
224        for item in resp.releases {
225            println!("{}: {}", item.id, item.name);
226        }
227    } 
228}