use super::{
line_default::{load_line_default, XlsxLineDefault},
shape_default::{load_shape_default, XlsxShapeDefault},
text_default::{load_text_default, XlsxTextDefault},
};
use crate::excel::XmlReader;
use anyhow::bail;
use quick_xml::events::Event;
use std::io::Read;
#[derive(Debug, Clone, PartialEq)]
pub struct XlsxObjectDefaults {
pub line_defaults: Option<Box<XlsxLineDefault>>,
pub shape_defaults: Option<Box<XlsxShapeDefault>>,
pub text_defaults: Option<Box<XlsxTextDefault>>,
}
impl XlsxObjectDefaults {
pub(crate) fn load(reader: &mut XmlReader<impl Read>) -> anyhow::Result<Self> {
let mut buf = Vec::new();
let mut defaults = Self {
line_defaults: None,
shape_defaults: None,
text_defaults: None,
};
loop {
buf.clear();
match reader.read_event_into(&mut buf) {
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"extLst" => {
let _ = reader.read_to_end_into(e.to_end().to_owned().name(), &mut Vec::new());
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"lnDef" => {
defaults.line_defaults = Some(Box::new(load_line_default(reader)?));
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"spDef" => {
defaults.shape_defaults = Some(Box::new(load_shape_default(reader)?));
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"txDef" => {
defaults.text_defaults = Some(Box::new(load_text_default(reader)?));
}
Ok(Event::End(ref e)) if e.local_name().as_ref() == b"objectDefaults" => break,
Ok(Event::Eof) => bail!("unexpected end of file."),
Err(e) => bail!(e.to_string()),
_ => (),
}
}
Ok(defaults)
}
}