Skip to main content

ferric_fred/
release.rs

1use serde::{Deserialize, Serialize};
2
3use crate::ReleaseId;
4
5/// A FRED data release — a publication such as "Gross Domestic Product", from
6/// the `fred/release` and `fred/releases` endpoints.
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
8#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
9pub struct Release {
10    /// The release's identifier.
11    pub id: ReleaseId,
12
13    /// Human-readable name, e.g. `"Gross Domestic Product"`.
14    pub name: String,
15
16    /// Whether the release is accompanied by a press release.
17    pub press_release: bool,
18
19    /// A link to the release on the source's site, when FRED provides one.
20    #[serde(default)]
21    pub link: Option<String>,
22}
23
24/// A page of releases with pagination metadata, from the `fred/releases`
25/// endpoint.
26#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
27#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
28pub struct ReleasesResults {
29    /// Total number of releases available (across all pages).
30    pub count: u32,
31
32    /// The offset (number of releases skipped) for this page.
33    pub offset: u32,
34
35    /// The page-size limit that was applied.
36    pub limit: u32,
37
38    /// The releases on this page.
39    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}