umya-spreadsheet 3.0.0

umya-spreadsheet is a library written in pure Rust to read and write xlsx file.
Documentation
use std::{
    io,
    io::Cursor,
    path::Path,
};

use quick_xml::{
    Reader,
    Writer,
    events::BytesStart,
};

use crate::{
    reader::driver::get_attribute,
    structs::{
        StringValue,
        WriterManager,
        XlsxError,
        raw::RawFile,
    },
    writer::driver::write_start_tag,
};

#[derive(Clone, Debug, Default)]
pub(crate) struct RawRelationship {
    id:          StringValue,
    r_type:      StringValue,
    target:      StringValue,
    raw_file:    RawFile,
    target_mode: StringValue,
}

impl RawRelationship {
    #[inline]
    pub(crate) fn id(&self) -> &str {
        self.id.value_str()
    }

    #[inline]
    #[deprecated(since = "3.0.0", note = "Use id()")]
    pub(crate) fn get_id(&self) -> &str {
        self.id()
    }

    #[inline]
    pub(crate) fn set_id<S: Into<String>>(&mut self, value: S) -> &mut Self {
        self.id.set_value(value);
        self
    }

    #[inline]
    pub(crate) fn target(&self) -> &str {
        self.target.value_str()
    }

    #[inline]
    #[deprecated(since = "3.0.0", note = "Use target()")]
    pub(crate) fn get_target(&self) -> &str {
        self.target()
    }

    #[inline]
    pub(crate) fn set_target<S: Into<String>>(&mut self, value: S) -> &mut Self {
        self.target.set_value(value);
        self
    }

    #[inline]
    pub(crate) fn get_type(&self) -> &str {
        self.r_type.value_str()
    }

    #[inline]
    pub(crate) fn set_type<S: Into<String>>(&mut self, value: S) -> &mut Self {
        self.r_type.set_value(value);
        self
    }

    #[inline]
    pub(crate) fn raw_file(&self) -> &RawFile {
        &self.raw_file
    }

    #[inline]
    #[deprecated(since = "3.0.0", note = "Use raw_file()")]
    pub(crate) fn get_raw_file(&self) -> &RawFile {
        self.raw_file()
    }

    #[inline]
    pub(crate) fn raw_file_mut(&mut self) -> &mut RawFile {
        &mut self.raw_file
    }

    #[inline]
    #[deprecated(since = "3.0.0", note = "Use raw_file_mut()")]
    pub(crate) fn get_raw_file_mut(&mut self) -> &mut RawFile {
        self.raw_file_mut()
    }

    #[inline]
    pub(crate) fn set_raw_file(&mut self, value: RawFile) -> &mut Self {
        self.raw_file = value;
        self
    }

    #[inline]
    pub(crate) fn target_mode(&self) -> &str {
        self.target_mode.value_str()
    }

    #[inline]
    #[deprecated(since = "3.0.0", note = "Use target_mode()")]
    pub(crate) fn get_target_mode(&self) -> &str {
        self.target_mode()
    }

    #[inline]
    pub(crate) fn set_target_mode<S: Into<String>>(&mut self, value: S) -> &mut Self {
        self.target_mode.set_value(value);
        self
    }

    pub(crate) fn set_attributes<R: io::BufRead, A: io::Read + io::Seek>(
        &mut self,
        _reader: &mut Reader<R>,
        e: &BytesStart,
        arv: &mut zip::read::ZipArchive<A>,
        base_path: &str,
        source_file: Option<&Path>,
    ) {
        let Some(id) = get_attribute(e, b"Id") else {
            return;
        };
        let Some(type_val) = get_attribute(e, b"Type") else {
            return;
        };
        let Some(target) = get_attribute(e, b"Target") else {
            return;
        };
        self.set_id(id);
        self.set_type(type_val);
        self.set_target(target);
        if let Some(v) = get_attribute(e, b"TargetMode") {
            self.set_target_mode(v);
        }
        if self.target_mode() != "External" {
            let target = self.target().to_string();
            match source_file {
                Some(source_file) => self.raw_file_mut().set_attributes_from_source(
                    arv,
                    base_path,
                    &target,
                    source_file,
                ),
                None => self.raw_file_mut().set_attributes(arv, base_path, &target),
            }
        }
    }

    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
        let mut attributes: crate::structs::AttrCollection = Vec::new();
        attributes.push(("Id", self.id()).into());
        attributes.push(("Type", self.get_type()).into());
        attributes.push(("Target", self.target()).into());
        if self.target_mode() != "" {
            attributes.push(("TargetMode", self.target_mode()).into());
        }
        write_start_tag(writer, "Relationship", attributes, true);
    }

    #[inline]
    pub(crate) fn write_to_bin<W: io::Seek + io::Write>(
        &self,
        writer_mng: &mut WriterManager<W>,
    ) -> Result<(), XlsxError> {
        self.raw_file().write_to(writer_mng)
    }
}