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}