use serde::{Deserialize, Serialize};
use crate::model::common::Actions;
use crate::model::common::CtDest;
use crate::model::page::{CtTemplatePage, Pages};
use crate::types::{StBox, StId, StLoc, StRefId};
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Document {
#[serde(rename = "CommonData")]
pub common_data: CommonData,
#[serde(rename = "Pages")]
pub pages: Pages,
#[serde(rename = "Outlines")]
pub outlines: Option<Outlines>,
#[serde(rename = "Permissions")]
pub permissions: Option<CtPermission>,
#[serde(rename = "Actions")]
pub actions: Option<Actions>,
#[serde(rename = "VPreferences")]
pub v_preferences: Option<VPreferences>,
#[serde(rename = "Bookmarks")]
pub bookmarks: Option<Bookmarks>,
#[serde(rename = "Attachments")]
pub attachments: Option<StLoc>,
#[serde(rename = "Annotations")]
pub annotations: Option<StLoc>,
#[serde(rename = "CustomTags")]
pub custom_tags: Option<StLoc>,
#[serde(rename = "Extensions")]
pub extensions: Option<StLoc>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct CommonData {
#[serde(rename = "MaxUnitID")]
pub max_unit_id: StId,
#[serde(rename = "PageArea")]
pub page_area: Option<CtPageArea>,
#[serde(rename = "PublicRes", default)]
pub public_res: Vec<StLoc>,
#[serde(rename = "DocumentRes", default)]
pub document_res: Vec<StLoc>,
#[serde(rename = "TemplatePage", default)]
pub template_pages: Vec<CtTemplatePage>,
#[serde(rename = "DefaultCS")]
pub default_cs: Option<StRefId>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct CtPageArea {
#[serde(rename = "PhysicalBox")]
pub physical_box: StBox,
#[serde(rename = "ApplicationBox")]
pub application_box: Option<StBox>,
#[serde(rename = "ContentBox")]
pub content_box: Option<StBox>,
#[serde(rename = "BleedBox")]
pub bleed_box: Option<StBox>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct CtPermission {
#[serde(rename = "Edit")]
pub edit: Option<bool>,
#[serde(rename = "Annot")]
pub annot: Option<bool>,
#[serde(rename = "Export")]
pub export: Option<bool>,
#[serde(rename = "Signature")]
pub signature: Option<bool>,
#[serde(rename = "Watermark")]
pub watermark: Option<bool>,
#[serde(rename = "PrintScreen")]
pub print_screen: Option<bool>,
#[serde(rename = "Print")]
pub print: Option<Print>,
#[serde(rename = "ValidPeriod")]
pub valid_period: Option<ValidPeriod>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct Print {
#[serde(rename = "@Printable")]
pub printable: Option<bool>,
#[serde(rename = "@Copies")]
pub copies: Option<i64>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct ValidPeriod {
#[serde(rename = "@StartDate")]
pub start_date: Option<String>,
#[serde(rename = "@EndDate")]
pub end_date: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct VPreferences {
#[serde(rename = "PageMode")]
pub page_mode: Option<String>,
#[serde(rename = "PageLayout")]
pub page_layout: Option<String>,
#[serde(rename = "TabDisplay")]
pub tab_display: Option<String>,
#[serde(rename = "HideToolbar")]
pub hide_toolbar: Option<bool>,
#[serde(rename = "HideMenubar")]
pub hide_menubar: Option<bool>,
#[serde(rename = "HideWindowUI")]
pub hide_window_ui: Option<bool>,
#[serde(rename = "ZoomMode")]
pub zoom_mode: Option<String>,
#[serde(rename = "Zoom")]
pub zoom: Option<f64>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct Bookmarks {
#[serde(rename = "Bookmark", default)]
pub bookmarks: Vec<CtBookmark>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct CtBookmark {
#[serde(rename = "@Name")]
pub name: String,
#[serde(rename = "Dest")]
pub dest: Option<CtDest>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct Outlines {
#[serde(rename = "OutlineElem", default)]
pub outline_elems: Vec<CtOutlineElem>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct CtOutlineElem {
#[serde(rename = "@Title")]
pub title: String,
#[serde(rename = "@Count")]
pub count: Option<i64>,
#[serde(rename = "@Expanded")]
pub expanded: Option<bool>,
#[serde(rename = "Actions")]
pub actions: Option<Actions>,
#[serde(rename = "OutlineElem", default)]
pub children: Vec<CtOutlineElem>,
}
#[cfg(test)]
mod tests {
use super::CommonData;
#[test]
fn interleaved_public_res_collects_into_vec() {
let xml = r#"<ofd:CommonData xmlns:ofd="http://www.ofdspec.org/2016">
<ofd:MaxUnitID>10</ofd:MaxUnitID>
<ofd:PublicRes>PublicRes.xml</ofd:PublicRes>
<ofd:DocumentRes>DocumentRes.xml</ofd:DocumentRes>
<ofd:PublicRes>PublicRes_2.xml</ofd:PublicRes>
</ofd:CommonData>"#;
let cd: CommonData = quick_xml::de::from_str(xml).expect("parse CommonData");
assert_eq!(
cd.public_res
.iter()
.map(|l| l.0.as_str())
.collect::<Vec<_>>(),
["PublicRes.xml", "PublicRes_2.xml"],
);
assert_eq!(cd.document_res.len(), 1);
}
}