use serde::{Deserialize, Serialize};
#[derive(Default, Debug, Serialize, Deserialize, Clone)]
pub struct DimensionFilterGroup {
#[serde(rename = "groupType")]
pub group_type: Option<String>,
pub filters: Vec<DimensionFilterGroupFilter>,
}
#[derive(Default, Debug, Serialize, Deserialize, Clone)]
pub struct DimensionFilterGroupFilter {
pub dimension: Option<String>,
pub operator: Option<String>,
pub expression: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub enum Dimension {
Country,
Device,
Page,
Query,
SearchAppearance,
Date,
}
#[doc(hidden)]
#[deprecated(since = "0.2.0", note = "Use `Dimension` instead")]
pub type DIMENSION = Dimension;
#[derive(Default, Debug, Serialize, Deserialize)]
pub struct Sitemap {
pub path: Option<String>,
#[serde(rename = "lastSubmitted")]
pub last_submitted: Option<String>,
#[serde(rename = "isPending")]
pub is_pending: Option<bool>,
#[serde(rename = "isSitemapsIndex")]
pub is_sitemaps_index: Option<bool>,
#[serde(rename = "type")]
pub sitemap_type: Option<String>,
#[serde(rename = "lastDownloaded")]
pub last_downloaded: Option<String>,
pub warnings: Option<String>,
pub errors: Option<String>,
pub contents: Option<Vec<SitemapContent>>,
}
#[derive(Default, Debug, Serialize, Deserialize)]
pub struct SitemapContent {
#[serde(rename = "type")]
pub content_type: Option<String>,
pub submitted: Option<String>,
pub indexed: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_dimension_serialize() {
assert_eq!(
serde_json::to_string(&Dimension::Country).unwrap(),
"\"country\""
);
assert_eq!(
serde_json::to_string(&Dimension::Device).unwrap(),
"\"device\""
);
assert_eq!(
serde_json::to_string(&Dimension::Page).unwrap(),
"\"page\""
);
assert_eq!(
serde_json::to_string(&Dimension::Query).unwrap(),
"\"query\""
);
assert_eq!(
serde_json::to_string(&Dimension::SearchAppearance).unwrap(),
"\"searchAppearance\""
);
assert_eq!(
serde_json::to_string(&Dimension::Date).unwrap(),
"\"date\""
);
}
#[test]
fn test_dimension_deserialize() {
assert_eq!(
serde_json::from_str::<Dimension>("\"country\"").unwrap(),
Dimension::Country
);
assert_eq!(
serde_json::from_str::<Dimension>("\"query\"").unwrap(),
Dimension::Query
);
assert_eq!(
serde_json::from_str::<Dimension>("\"date\"").unwrap(),
Dimension::Date
);
}
#[test]
fn test_dimension_equality() {
assert_eq!(Dimension::Query, Dimension::Query);
assert_ne!(Dimension::Query, Dimension::Page);
}
#[test]
fn test_sitemap_deserialize() {
let json = r#"{
"path": "https://example.com/sitemap.xml",
"lastSubmitted": "2024-01-01T00:00:00Z",
"isPending": false,
"isSitemapsIndex": false,
"type": "sitemap"
}"#;
let sitemap: Sitemap = serde_json::from_str(json).unwrap();
assert_eq!(
sitemap.path,
Some("https://example.com/sitemap.xml".to_string())
);
assert_eq!(sitemap.is_pending, Some(false));
assert_eq!(sitemap.sitemap_type, Some("sitemap".to_string()));
}
#[test]
fn test_sitemap_default() {
let sitemap = Sitemap::default();
assert!(sitemap.path.is_none());
assert!(sitemap.is_pending.is_none());
}
#[test]
fn test_dimension_filter_group_serialize() {
let filter = DimensionFilterGroupFilter {
dimension: Some("query".to_string()),
operator: Some("contains".to_string()),
expression: Some("test".to_string()),
};
let group = DimensionFilterGroup {
group_type: Some("and".to_string()),
filters: vec![filter],
};
let json = serde_json::to_string(&group).unwrap();
assert!(json.contains("\"groupType\":\"and\""));
assert!(json.contains("\"dimension\":\"query\""));
assert!(json.contains("\"operator\":\"contains\""));
assert!(json.contains("\"expression\":\"test\""));
}
}