fred_rs/release/mod.rs
1//! Get a release of economic data
2//!
3//! [https://research.stlouisfed.org/docs/api/fred/release.html](https://research.stlouisfed.org/docs/api/fred/release.html)
4//!
5//! ```
6//! use fred_rs::client::FredClient;
7//! use fred_rs::release::{Builder, Response};
8//!
9//! let mut c = match FredClient::new() {
10//! Ok(c) => c,
11//! Err(msg) => {
12//! println!("{}", msg);
13//! assert_eq!(2, 1);
14//! return
15//! },
16//! };
17//!
18//! let mut builder = Builder::new();
19//! builder
20//! .realtime_start("2000-01-01");
21//!
22//! let resp: Response = match c.release(9, Some(builder)) {
23//! Ok(resp) => resp,
24//! Err(msg) => {
25//! println!("{}", msg);
26//! assert_eq!(2, 1);
27//! return
28//! },
29//! };
30//!
31//! for item in resp.releases {
32//! println!("{}: {}", item.id, item.name);
33//! }
34//! ```
35
36pub mod series;
37pub mod sources;
38pub mod tags;
39pub mod related_tags;
40pub mod tables;
41
42// -----------------------------------------------------------------------------
43use serde::Deserialize;
44use std::fmt::{self, Display, Formatter};
45
46#[derive(Deserialize, Clone, Debug, Default)]
47/// Response data structure for the fred/release endpoint
48///
49/// [https://research.stlouisfed.org/docs/api/fred/release.html] (https://research.stlouisfed.org/docs/api/fred/release.html)
50pub struct Response {
51 /// The Real Time start date for the request
52 pub realtime_start: String,
53 /// The Real Time end data for the request
54 pub realtime_end: String,
55 /// How the results are ordered
56 pub order_by: Option<String>,
57 // Results are listed in ascending or descending
58 pub sort_order: Option<String>,
59 /// Number of results returned
60 pub count: Option<usize>,
61 /// ???
62 pub offset: Option<usize>,
63 /// Maximum number of results to return
64 pub limit: Option<usize>,
65 /// List of releases related to the specified series_id
66 pub releases: Vec<Release>,
67}
68
69impl Display for Response {
70 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
71 for item in self.releases.iter() {
72 match item.fmt(f) {
73 Ok(_) => (),
74 Err(e) => return Err(e),
75 }
76 match writeln!(f, "") {
77 Ok(_) => (),
78 Err(e) => return Err(e),
79 }
80 }
81 Ok(())
82 }
83}
84
85#[derive(Deserialize, Clone, Debug, Default)]
86/// Data structure containing information about a particular release
87///
88/// [https://research.stlouisfed.org/docs/api/fred/release.html](https://research.stlouisfed.org/docs/api/fred/release.html)
89pub struct Release {
90 /// The category ID number
91 pub id: usize,
92 /// The Real Time start date for the request
93 pub realtime_start: String,
94 /// The Real Time end data for the request
95 pub realtime_end: String,
96 /// The releaase name
97 pub name: String,
98 /// Indicates if there was a press release
99 pub press_release: bool,
100 /// A link to the press release if there was one
101 pub link: Option<String>,
102 /// Addition notes about the release
103 pub notes: Option<String>
104}
105
106impl Display for Release {
107 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
108 write!(f, "Release {}: {}", self.id, self.name)
109 }
110}
111
112pub struct Builder {
113 option_string: String
114}
115
116impl Builder {
117
118 /// Initializes a new series::release::Builder that can be used to add commands to an API request
119 ///
120 /// The builder does not do validity checking of the arguments nor does it check for duplicates.
121 ///
122 /// ```
123 /// use fred_rs::release::Builder;
124 /// // Create a new builder
125 /// let mut builder = Builder::new();
126 /// // add arguments to the builder
127 /// builder
128 /// .realtime_start("1900-01-01")
129 /// .realtime_end("2000-01-01");
130 /// ```
131 pub fn new() -> Builder {
132 Builder {
133 option_string: String::new(),
134 }
135 }
136
137 /// Returns the current arguments as a URL formatted string
138 pub(crate) fn build(self) -> String {
139 self.option_string
140 }
141
142 /// Adds a realtime_start argument to the builder
143 ///
144 /// # Arguments
145 /// * `start_date` - date formatted as YYYY-MM-DD
146 ///
147 /// [https://research.stlouisfed.org/docs/api/fred/release.html#realtime_start](https://research.stlouisfed.org/docs/api/fred/release.html#realtime_start)
148 pub fn realtime_start(&mut self, start_date: &str) -> &mut Builder {
149 self.option_string += format!("&realtime_start={}", start_date).as_str();
150 self
151 }
152
153 /// Adds a realtime_end argument to the builder
154 ///
155 /// # Arguments
156 /// * `end_date` - date formatted as YYYY-MM-DD
157 ///
158 /// [https://research.stlouisfed.org/docs/api/fred/release.html#realtime_end](https://research.stlouisfed.org/docs/api/fred/release.html#realtime_end)
159 pub fn realtime_end(&mut self, end_date: &str) -> &mut Builder {
160 self.option_string += format!("&realtime_end={}", end_date).as_str();
161 self
162 }
163}
164
165#[cfg(test)]
166mod tests {
167 use super::*;
168 use crate::client::FredClient;
169
170 #[test]
171 fn release_with_options() {
172 let mut c = match FredClient::new() {
173 Ok(c) => c,
174 Err(msg) => {
175 println!("{}", msg);
176 assert_eq!(2, 1);
177 return
178 },
179 };
180
181 let mut builder = Builder::new();
182 builder.realtime_start("2000-01-01");
183
184 let resp: Response = match c.release(9, Some(builder)) {
185 Ok(resp) => resp,
186 Err(msg) => {
187 println!("{}", msg);
188 assert_eq!(2, 1);
189 return
190 },
191 };
192
193 for item in resp.releases {
194 println!("{}: {}", item.name, item.press_release);
195 }
196 }
197}