use std::io::Read;
use anyhow::bail;
use quick_xml::events::Event;
use crate::{
excel::XmlReader,
raw::drawing::{
graphic::graphic_frame::XlsxGraphicFrame, image::picture::XlsxPicture,
shape::connection_shape::XlsxConnectionShape,
},
};
use super::{
client_data::XlsxClientData, content_part::XlsxContentPart,
drawing_content_type::XlsxWorksheetDrawingContentType, group_shape::XlsxGroupShape,
spreadsheet_extent::XlsxSpreadsheetExtent, spreadsheet_position::XlsxSpreadsheetPosition,
spreadsheet_shape::XlsxShape,
};
#[derive(Debug, Clone, PartialEq)]
pub struct XlsxAbsoluteAnchor {
pub client_data: Option<XlsxClientData>,
pub content_part: Option<XlsxContentPart>,
pub extent: Option<XlsxSpreadsheetExtent>,
pub drawing_content: Option<XlsxWorksheetDrawingContentType>,
pub position: Option<XlsxSpreadsheetPosition>,
}
impl XlsxAbsoluteAnchor {
pub(crate) fn load(reader: &mut XmlReader<impl Read>) -> anyhow::Result<Self> {
let mut buf = Vec::new();
let mut anchor = Self {
client_data: None,
content_part: None,
extent: None,
position: None,
drawing_content: None,
};
loop {
buf.clear();
match reader.read_event_into(&mut buf) {
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"clientData" => {
anchor.client_data = Some(XlsxClientData::load(e)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"contentPart" => {
anchor.content_part = Some(XlsxContentPart::load(reader, e)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"graphicFrame" => {
anchor.drawing_content = Some(XlsxWorksheetDrawingContentType::GraphicFrame(
XlsxGraphicFrame::load(reader, e)?,
));
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"cxnSp" => {
anchor.drawing_content =
Some(XlsxWorksheetDrawingContentType::ConnectionShape(
XlsxConnectionShape::load(reader, e)?,
));
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"ext" => {
anchor.extent = Some(XlsxSpreadsheetExtent::load(e)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"grpSp" => {
anchor.drawing_content = Some(XlsxWorksheetDrawingContentType::GroupShape(
XlsxGroupShape::load(reader)?,
))
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"pic" => {
anchor.drawing_content = Some(XlsxWorksheetDrawingContentType::Picture(
XlsxPicture::load(reader, e)?,
))
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"sp" => {
anchor.drawing_content = Some(XlsxWorksheetDrawingContentType::Shape(
XlsxShape::load(reader, e)?,
))
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"pos" => {
anchor.position = Some(XlsxSpreadsheetPosition::load(e)?);
}
Ok(Event::End(ref e)) if e.local_name().as_ref() == b"absoluteAnchor" => break,
Ok(Event::Eof) => {
bail!("unexpected end of file at `absoluteAnchor`.")
}
Err(e) => bail!(e.to_string()),
_ => (),
}
}
Ok(anchor)
}
}