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}