1use serde::{Deserialize, Serialize};
2
3use crate::ReleaseId;
4
5#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
8#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
9pub struct Release {
10 pub id: ReleaseId,
12
13 pub name: String,
15
16 pub press_release: bool,
18
19 #[serde(default)]
21 pub link: Option<String>,
22}
23
24#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
27#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
28pub struct ReleasesResults {
29 pub count: u32,
31
32 pub offset: u32,
34
35 pub limit: u32,
37
38 pub releases: Vec<Release>,
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn deserializes_a_release_with_a_link() {
48 let release: Release = serde_json::from_str(
49 r#"{"id":53,"realtime_start":"2013-08-13","realtime_end":"2013-08-13",
50 "name":"Gross Domestic Product","press_release":true,
51 "link":"http://www.bea.gov/national/index.htm"}"#,
52 )
53 .unwrap();
54 assert_eq!(release.id, ReleaseId::new(53));
55 assert_eq!(release.name, "Gross Domestic Product");
56 assert!(release.press_release);
57 assert_eq!(
58 release.link.as_deref(),
59 Some("http://www.bea.gov/national/index.htm")
60 );
61 }
62
63 #[test]
64 fn release_without_link_defaults_to_none() {
65 let release: Release = serde_json::from_str(
66 r#"{"id":9,"name":"Advance Monthly Sales","press_release":false}"#,
67 )
68 .unwrap();
69 assert!(release.link.is_none());
70 }
71
72 #[test]
73 fn releases_results_carry_pagination() {
74 let results: ReleasesResults = serde_json::from_str(
75 r#"{"count":2,"offset":0,"limit":1000,"releases":[
76 {"id":9,"name":"Advance Monthly Sales","press_release":false},
77 {"id":10,"name":"Consumer Price Index","press_release":true}
78 ]}"#,
79 )
80 .unwrap();
81 assert_eq!(results.count, 2);
82 assert_eq!(results.releases.len(), 2);
83 assert_eq!(results.releases[1].id, ReleaseId::new(10));
84 }
85}