fred_rs/release/
tables.rs

1//! Get the release tables for a given release
2//! 
3//! [https://research.stlouisfed.org/docs/api/fred/release_tables.html](https://research.stlouisfed.org/docs/api/fred/release_tables.html)
4//! 
5//! ```
6//! use fred_rs::client::FredClient;
7//! use fred_rs::release::tables::{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//!     .include_observation_values();
21//! 
22//! let resp: Response = match c.release_tables(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 (key, value) in resp.elements {
32//!     println!("{}: {}", key, value.name);
33//! }
34//! ```
35
36use serde::Deserialize;
37use std::collections::HashMap;
38
39#[derive(Deserialize)]
40/// Response data structure for the fred/release/tables endpoint
41/// 
42/// [https://research.stlouisfed.org/docs/api/fred/release_tables.html] (https://research.stlouisfed.org/docs/api/fred/release_tables.html)
43pub struct Response {
44    /// The name of the release
45    pub name: Option<String>,
46    /// The table element ID number
47    pub element_id: Option<usize>,
48    /// The release ID number that was queried
49    pub release_id: String,
50    /// List of releases related to the specified series_id
51    pub elements: HashMap<String, Element>,
52}
53
54#[derive(Deserialize)]
55/// Data structure containing infomation about a particular release table element
56/// 
57/// [https://research.stlouisfed.org/docs/api/fred/release_tables.html](https://research.stlouisfed.org/docs/api/fred/release_tables.html)
58pub struct Element {
59    /// The element ID number
60    pub element_id: usize,
61    /// The release ID number
62    pub release_id: usize,
63    /// The series name
64    pub series_id: Option<String>,
65    /// The parent element ID number
66    pub parent_id: Option<usize>,
67    /// The table line number
68    pub line: Option<String>,
69    /// The element type
70    #[serde(rename = "type")]
71    pub etype: String,
72    /// The element name
73    pub name: String,
74    /// The element nesting level
75    pub level: String,
76    // Children of this element
77    pub children: Vec<Element>,
78}
79
80pub struct Builder {
81    option_string: String
82}
83
84impl Builder {
85
86    /// Initializes a new release::tables::Builder that can be used to add commands to an API request
87    /// 
88    /// The builder does not do validity checking of the arguments nor does it check for duplicates.
89    /// 
90    /// ```
91    /// use fred_rs::release::tables::Builder;
92    /// // Create a new builder
93    /// let mut builder = Builder::new();
94    /// // add arguments to the builder
95    /// builder
96    ///     .include_observation_values();
97    /// ```
98    pub fn new() -> Builder {
99        Builder {
100            option_string: String::new(),
101        }
102    }
103
104    /// Returns the current arguments as a URL formatted string
105    pub(crate) fn build(self) -> String {
106        self.option_string
107    }
108
109    /// Add the element_id argument to the builder
110    /// 
111    /// # Arguments
112    /// * `id` - The release table element id you would like to retrieve
113    /// 
114    /// [https://research.stlouisfed.org/docs/api/fred/release_tables.html#element_id](https://research.stlouisfed.org/docs/api/fred/release_tables.html#element_id)
115    pub fn element_id(&mut self, id: usize) -> &mut Builder {
116        self.option_string += format!("&element_id={}", id).as_str();
117        self
118    }
119
120    /// Use to indicate that observation values should be returned as well for applicable series
121    /// 
122    /// [https://research.stlouisfed.org/docs/api/fred/release_tables.html#include_observation_values](https://research.stlouisfed.org/docs/api/fred/release_tables.html#include_observation_values)
123    pub fn include_observation_values(&mut self) -> &mut Builder {
124        self.option_string += "&include_observation_values=true";
125        self
126    }
127
128    /// Adds an observation date to be returned with the release table
129    /// 
130    /// # Arguments
131    /// * `date` - date formatted as YYYY-MM-DD
132    /// 
133    /// [https://research.stlouisfed.org/docs/api/fred/release_tables.html#observation_date](https://research.stlouisfed.org/docs/api/fred/release_tables.html#observation_date)
134    pub fn observation_date(&mut self, date: &str) -> &mut Builder {
135        self.option_string += format!("&observation_date={}", date).as_str();
136        self
137    }
138}
139
140#[cfg(test)]
141mod tests {
142    use super::*;
143    use crate::client::FredClient;
144
145    #[test]
146    fn release_tables_with_options() {
147        let mut c = match FredClient::new() {
148            Ok(c) => c,
149            Err(msg) => {
150                println!("{}", msg);
151                assert_eq!(2, 1);
152                return
153            },
154        };
155
156        let mut builder = Builder::new();
157        builder.include_observation_values();
158
159        let resp: Response = match c.release_tables(53, Some(builder)) {
160            Ok(resp) => resp,
161            Err(msg) => {
162                println!("{}", msg);
163                assert_eq!(2, 1);
164                return
165            },
166        };
167
168        for (key, value) in resp.elements {
169            println!("{}: {}", key, value.name);
170        }
171    } 
172}