use serde::Deserialize;
use std::collections::HashMap;
#[derive(Deserialize)]
pub struct Response {
pub name: Option<String>,
pub element_id: Option<usize>,
pub release_id: String,
pub elements: HashMap<String, Element>,
}
#[derive(Deserialize)]
pub struct Element {
pub element_id: usize,
pub release_id: usize,
pub series_id: Option<String>,
pub parent_id: Option<usize>,
pub line: Option<String>,
#[serde(rename = "type")]
pub etype: String,
pub name: String,
pub level: String,
pub children: Vec<Element>,
}
pub struct Builder {
option_string: String
}
impl Builder {
pub fn new() -> Builder {
Builder {
option_string: String::new(),
}
}
pub(crate) fn build(self) -> String {
self.option_string
}
pub fn element_id(&mut self, id: usize) -> &mut Builder {
self.option_string += format!("&element_id={}", id).as_str();
self
}
pub fn include_observation_values(&mut self) -> &mut Builder {
self.option_string += "&include_observation_values=true";
self
}
pub fn observation_date(&mut self, date: &str) -> &mut Builder {
self.option_string += format!("&observation_date={}", date).as_str();
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::client::FredClient;
#[test]
fn release_tables_with_options() {
let mut c = match FredClient::new() {
Ok(c) => c,
Err(msg) => {
println!("{}", msg);
assert_eq!(2, 1);
return
},
};
let mut builder = Builder::new();
builder.include_observation_values();
let resp: Response = match c.release_tables(53, Some(builder)) {
Ok(resp) => resp,
Err(msg) => {
println!("{}", msg);
assert_eq!(2, 1);
return
},
};
for (key, value) in resp.elements {
println!("{}: {}", key, value.name);
}
}
}