use serde::{Deserialize, Serialize};
use crate::presentation::{Canvas, LangMap, Metadata, Resource};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Range {
pub id: String,
#[serde(default = "range_type")]
pub r#type: String,
pub label: LangMap,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<LangMap>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Vec<Metadata>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required_statement: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rights: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub language: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub provider: Option<Vec<Resource>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logo: Option<Vec<Resource>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<Vec<Resource>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub homepage: Option<Vec<Resource>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub see_also: Option<Vec<Resource>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rendering: Option<Vec<Resource>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service: Option<Vec<Resource>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub part_of: Option<Vec<Resource>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub behavior: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub viewing_direction: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub items: Option<Vec<RangeItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start: Option<Resource>,
}
fn range_type() -> String {
"Range".to_string()
}
impl Default for Range {
fn default() -> Self {
Self {
id: "".to_string(),
r#type: range_type(),
label: LangMap::default(),
summary: None,
metadata: None,
required_statement: None,
rights: None,
language: None,
provider: None,
logo: None,
thumbnail: None,
homepage: None,
see_also: None,
rendering: None,
service: None,
part_of: None,
behavior: None,
viewing_direction: None,
items: None,
start: None,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum RangeItem {
Range(Box<Range>),
Canvas(Box<Canvas>),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_range_default() {
let range = Range::default();
assert_eq!(range.id, "");
assert_eq!(range.r#type, "Range");
}
}