use serde::Deserialize;
use std::fmt::{self, Display, Formatter};
#[derive(Deserialize, Clone, Debug, Default)]
pub struct Response {
pub realtime_start: String,
pub realtime_end: String,
pub order_by: String,
pub sort_order: String,
pub count: usize,
pub offset: usize,
pub limit: usize,
pub release_dates: Vec<ReleaseDate>,
}
impl Display for Response {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
for item in self.release_dates.iter() {
match item.fmt(f) {
Ok(_) => (),
Err(e) => return Err(e),
}
match writeln!(f, "") {
Ok(_) => (),
Err(e) => return Err(e),
}
}
Ok(())
}
}
#[derive(Deserialize, Clone, Debug, Default)]
pub struct ReleaseDate {
pub release_id: usize,
pub release_name: Option<String>,
pub date: String,
}
impl Display for ReleaseDate {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "Release Date {}: {}", self.release_id, self.date)
}
}
pub enum OrderBy {
ReleaseDate,
ReleaseId,
ReleaseName,
}
pub enum SortOrder {
Ascending,
Descending,
}
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 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::ReleaseDate => {
self.option_string += "&order_by=release_name";
},
OrderBy::ReleaseId => {
self.option_string += "&order_by=release_id";
},
OrderBy::ReleaseName => {
self.option_string += "&order_by=name";
},
};
self
}
pub fn sort_order(&mut self, order: SortOrder) -> &mut Builder {
match order {
SortOrder::Ascending => {
self.option_string += format!("&sort_order=asc").as_str()
},
_ => () }
self
}
pub fn include_release_dates_with_no_data(&mut self) -> &mut Builder {
self.option_string += format!(
"&include_release_dates_with_no_data=true"
).as_str();
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::client::FredClient;
#[test]
fn releases_dates_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::Ascending)
.order_by(OrderBy::ReleaseId);
let resp: Response = match c.releases_dates(Some(builder)) {
Ok(resp) => resp,
Err(msg) => {
println!("{}", msg);
assert_eq!(2, 1);
return
},
};
for item in resp.release_dates {
println!("{}: {} -> {}", item.date, item.release_id, item.release_name.unwrap());
}
}
}