pub mod crypto;
pub mod error;
pub mod model;
pub mod package;
pub mod render;
pub mod types;
pub mod verify;
pub mod xmlfmt;
use std::fs::File;
use std::io::{Read, Seek};
use std::path::Path;
pub use error::{OfdError, Result};
pub use model::*;
pub use package::OfdPackage;
pub use render::RenderOptions;
pub use types::{StArray, StBox, StId, StLoc, StPos, StRefId, parent_dir, resolve_path};
pub use verify::{
CheckMethod, CheckReport, LoadedSignature, RefStatus, SigVerdict, SignatureReport, check_path,
check_reader,
};
pub use xmlfmt::pretty_xml;
pub const ENTRY_OFD: &str = "OFD.xml";
pub struct OfdReader<R> {
package: OfdPackage<R>,
ofd: Ofd,
}
impl OfdReader<File> {
pub fn open<P: AsRef<Path>>(path: P) -> Result<Self> {
Self::new(OfdPackage::open(path)?)
}
}
impl<R: Read + Seek> OfdReader<R> {
pub fn new(mut package: OfdPackage<R>) -> Result<Self> {
let ofd: Ofd = package.parse(ENTRY_OFD)?;
Ok(OfdReader { package, ofd })
}
pub fn ofd(&self) -> &Ofd {
&self.ofd
}
pub fn package_mut(&mut self) -> &mut OfdPackage<R> {
&mut self.package
}
pub fn load_document(&mut self, body: &DocBody) -> Result<LoadedDocument> {
let doc_root = body
.doc_root
.as_ref()
.ok_or_else(|| OfdError::Structure("DocBody is missing DocRoot".to_string()))?;
let path = resolve_path("", doc_root);
let base = parent_dir(&path).to_string();
let document: Document = self.package.parse(&path)?;
Ok(LoadedDocument { document, base })
}
pub fn load_page(&mut self, doc: &LoadedDocument, page: &PageRef) -> Result<PageObject> {
let path = resolve_path(&doc.base, &page.base_loc);
self.package.parse(&path)
}
pub fn load_template(
&mut self,
doc: &LoadedDocument,
template: &CtTemplatePage,
) -> Result<PageObject> {
let path = resolve_path(&doc.base, &template.base_loc);
self.package.parse(&path)
}
pub fn load_resource(&mut self, doc: &LoadedDocument, loc: &StLoc) -> Result<Res> {
let path = resolve_path(&doc.base, loc);
self.package.parse(&path)
}
}
pub struct LoadedDocument {
pub document: Document,
pub base: String,
}
impl LoadedDocument {
pub fn pages(&self) -> &[PageRef] {
&self.document.pages.pages
}
pub fn template_pages(&self) -> &[CtTemplatePage] {
&self.document.common_data.template_pages
}
pub fn public_res(&self) -> &[StLoc] {
&self.document.common_data.public_res
}
pub fn document_res(&self) -> &[StLoc] {
&self.document.common_data.document_res
}
}