use crate::excel::XmlReader;
use crate::raw::drawing::{
scene::scene_3d_type::XlsxScene3DType, shape::shape_3d_type::XlsxShape3DType,
};
use anyhow::bail;
use quick_xml::events::Event;
use std::io::Read;
use super::{effect_container::XlsxEffectDag, effect_list::XlsxEffectList};
#[derive(Debug, Clone, PartialEq)]
pub struct XlsxEffectStyle {
pub effect_dag: Option<XlsxEffectDag>,
pub effect_lst: Option<XlsxEffectList>,
pub scene3d: Option<XlsxScene3DType>,
pub shape3d: Option<XlsxShape3DType>,
}
impl XlsxEffectStyle {
pub(crate) fn load(reader: &mut XmlReader<impl Read>) -> anyhow::Result<Self> {
let mut style = Self {
effect_dag: None,
effect_lst: None,
scene3d: None,
shape3d: None,
};
let mut buf = Vec::new();
loop {
buf.clear();
match reader.read_event_into(&mut buf) {
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"effectDag" => {
style.effect_dag = Some(XlsxEffectDag::load_effect_dag(reader, e)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"effectLst" => {
style.effect_lst = Some(XlsxEffectList::load(reader)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"scene3d" => {
style.scene3d = Some(XlsxScene3DType::load(reader)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"sp3d" => {
style.shape3d = Some(XlsxShape3DType::load(reader, e)?);
}
Ok(Event::End(ref e)) if e.local_name().as_ref() == b"effectStyle" => break,
Ok(Event::Eof) => bail!("unexpected end of file."),
Err(e) => bail!(e.to_string()),
_ => (),
}
}
Ok(style)
}
}