use serde::{Deserialize, Serialize};
use crate::ReleaseId;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Release {
pub id: ReleaseId,
pub name: String,
pub press_release: bool,
#[serde(default)]
pub link: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ReleasesResults {
pub count: u32,
pub offset: u32,
pub limit: u32,
pub releases: Vec<Release>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn deserializes_a_release_with_a_link() {
let release: Release = serde_json::from_str(
r#"{"id":53,"realtime_start":"2013-08-13","realtime_end":"2013-08-13",
"name":"Gross Domestic Product","press_release":true,
"link":"http://www.bea.gov/national/index.htm"}"#,
)
.unwrap();
assert_eq!(release.id, ReleaseId::new(53));
assert_eq!(release.name, "Gross Domestic Product");
assert!(release.press_release);
assert_eq!(
release.link.as_deref(),
Some("http://www.bea.gov/national/index.htm")
);
}
#[test]
fn release_without_link_defaults_to_none() {
let release: Release = serde_json::from_str(
r#"{"id":9,"name":"Advance Monthly Sales","press_release":false}"#,
)
.unwrap();
assert!(release.link.is_none());
}
#[test]
fn releases_results_carry_pagination() {
let results: ReleasesResults = serde_json::from_str(
r#"{"count":2,"offset":0,"limit":1000,"releases":[
{"id":9,"name":"Advance Monthly Sales","press_release":false},
{"id":10,"name":"Consumer Price Index","press_release":true}
]}"#,
)
.unwrap();
assert_eq!(results.count, 2);
assert_eq!(results.releases.len(), 2);
assert_eq!(results.releases[1].id, ReleaseId::new(10));
}
}