use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Tag {
pub name: String,
pub group_id: String,
#[serde(default)]
pub notes: Option<String>,
pub popularity: u32,
pub series_count: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TagsResults {
pub count: u32,
pub offset: u32,
pub limit: u32,
pub tags: Vec<Tag>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn deserializes_a_tag() {
let tag: Tag = serde_json::from_str(
r#"{"name":"gdp","group_id":"gen","notes":"Gross Domestic Product",
"created":"2012-02-27 10:18:19-06","popularity":80,"series_count":12345}"#,
)
.unwrap();
assert_eq!(tag.name, "gdp");
assert_eq!(tag.group_id, "gen");
assert_eq!(tag.notes.as_deref(), Some("Gross Domestic Product"));
assert_eq!(tag.popularity, 80);
assert_eq!(tag.series_count, 12345);
}
#[test]
fn tag_notes_may_be_null_or_absent() {
let with_null: Tag = serde_json::from_str(
r#"{"name":"nsa","group_id":"seas","notes":null,"popularity":90,"series_count":9}"#,
)
.unwrap();
assert!(with_null.notes.is_none());
let absent: Tag = serde_json::from_str(
r#"{"name":"nsa","group_id":"seas","popularity":90,"series_count":9}"#,
)
.unwrap();
assert!(absent.notes.is_none());
}
#[test]
fn tags_results_carry_pagination() {
let results: TagsResults = serde_json::from_str(
r#"{"count":2,"offset":0,"limit":1000,"tags":[
{"name":"gdp","group_id":"gen","popularity":80,"series_count":12345},
{"name":"quarterly","group_id":"freq","popularity":75,"series_count":6789}
]}"#,
)
.unwrap();
assert_eq!(results.count, 2);
assert_eq!(results.tags.len(), 2);
assert_eq!(results.tags[1].name, "quarterly");
}
}