pub enum OrderBy {
SeriesId,
Title,
Units,
Frequency,
SeasonalAdjustment,
RealtimeStart,
RealtimeEnd,
LastUpdated,
ObservationStart,
ObservationEnd,
Popularity,
GroupPopularity,
}
pub enum SortOrder {
Ascending,
Descending,
}
pub enum FilterVariable {
Frequency,
Units,
SeasonalAdjustment,
}
pub struct Builder {
option_string: String,
include_tags: String,
exclude_tags: String,
}
impl Builder {
pub fn new() -> Builder {
Builder {
option_string: String::new(),
include_tags: String::new(),
exclude_tags: String::new(),
}
}
pub(crate) fn build(mut self) -> String {
if self.include_tags.len() > 0 {
self.option_string += format!("&tag_names={}", self.include_tags).as_str()
}
if self.exclude_tags.len() > 0 {
self.option_string += format!("&exclude_tag_names={}", self.exclude_tags).as_str()
}
self.option_string
}
pub fn realtime_start(&mut self, start_date: &str) -> &mut Builder {
self.option_string += format!("&realtime_start={}", start_date).as_str();
self
}
pub fn realtime_end(&mut self, end_date: &str) -> &mut Builder {
self.option_string += format!("&realtime_end={}", end_date).as_str();
self
}
pub fn limit(&mut self, num_results: usize) -> &mut Builder {
let num_results = if num_results > 1000 { 1000
} else {
num_results
};
self.option_string += format!("&limit={}", num_results).as_str();
self
}
pub fn offset(&mut self, ofs: usize) -> &mut Builder {
self.option_string += format!("&offset={}", ofs).as_str();
self
}
pub fn order_by(&mut self, order: OrderBy) -> &mut Builder {
match order {
OrderBy::SeriesId => {
self.option_string += "&order_by=series_id";
},
OrderBy::Title => {
self.option_string += "&order_by=title";
},
OrderBy::Units => {
self.option_string += "&order_by=units";
},
OrderBy::Frequency => {
self.option_string += "&order_by=frequency";
},
OrderBy::SeasonalAdjustment => {
self.option_string += "&order_by=seasonal_adjustment";
},
OrderBy::RealtimeStart => {
self.option_string += "&order_by=realtime_start";
},
OrderBy::RealtimeEnd => {
self.option_string += "&order_by=realtime_end";
},
OrderBy::LastUpdated => {
self.option_string += "&order_by=last_updated";
},
OrderBy::ObservationStart => {
self.option_string += "&order_by=observation_start";
},
OrderBy::ObservationEnd => {
self.option_string += "&order_by=observation_end";
},
OrderBy::Popularity => {
self.option_string += "&order_by=popularity";
},
OrderBy::GroupPopularity => {
self.option_string += "&order_by=group_popularity";
},
};
self
}
pub fn sort_order(&mut self, order: SortOrder) -> &mut Builder {
match order {
SortOrder::Descending => {
self.option_string += format!("&sort_order=desc").as_str()
},
_ => () }
self
}
pub fn filter_variable(&mut self, var: FilterVariable) -> &mut Builder {
match var {
FilterVariable::Frequency => {
self.option_string += "&filter_variable=frequency";
},
FilterVariable::Units => {
self.option_string += "&filter_variable=units";
},
FilterVariable::SeasonalAdjustment => {
self.option_string += "&filter_variable=seasonal_adjustment";
},
};
self
}
pub fn filter_value(&mut self, val: &str) -> &mut Builder {
self.option_string += format!("&filter_value={}", val).as_str();
self
}
pub fn tag_name(&mut self, tag: &str) -> &mut Builder {
if self.include_tags.len() != 0 {
self.include_tags.push(';');
}
self.include_tags += tag;
self
}
pub fn exclude_tag(&mut self, tag: &str) -> &mut Builder {
if self.exclude_tags.len() != 0 {
self.exclude_tags.push(';');
}
self.exclude_tags += tag;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::series::Response;
use crate::client::FredClient;
#[test]
fn release_series_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
.limit(5)
.sort_order(SortOrder::Descending)
.order_by(OrderBy::Frequency);
let resp: Response = match c.release_series(9, Some(builder)) {
Ok(resp) => resp,
Err(msg) => {
println!("{}", msg);
assert_eq!(2, 1);
return
},
};
for item in resp.seriess {
println!(
"{}: {} {}",
item.id,
item.title,
item.frequency,
);
}
}
}