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}