Skip to main content

umya_spreadsheet/structs/
formula.rs

1// formula
2use std::io::Cursor;
3
4use quick_xml::{
5    Reader,
6    Writer,
7    events::BytesStart,
8};
9
10use super::{
11    Address,
12    StringValue,
13};
14use crate::{
15    helper::address::is_address,
16    writer::driver::{
17        write_end_tag,
18        write_start_tag,
19        write_text_node,
20    },
21};
22
23#[derive(Clone, Default, Debug)]
24pub struct Formula {
25    address:      Address,
26    string_value: StringValue,
27}
28
29impl Formula {
30    #[inline]
31    #[must_use]
32    pub fn address(&self) -> &Address {
33        &self.address
34    }
35
36    #[inline]
37    #[must_use]
38    #[deprecated(since = "3.0.0", note = "Use address()")]
39    pub fn get_address(&self) -> &Address {
40        self.address()
41    }
42
43    #[inline]
44    pub fn address_mut(&mut self) -> &mut Address {
45        &mut self.address
46    }
47
48    #[inline]
49    #[deprecated(since = "3.0.0", note = "Use address_mut()")]
50    pub fn get_address_mut(&mut self) -> &mut Address {
51        self.address_mut()
52    }
53
54    #[inline]
55    #[must_use]
56    pub fn address_str(&self) -> String {
57        if self.string_value.has_value() {
58            return self.string_value.value_str().to_string();
59        }
60        self.address.address()
61    }
62
63    #[inline]
64    #[must_use]
65    #[deprecated(since = "3.0.0", note = "Use address_str()")]
66    pub fn get_address_str(&self) -> String {
67        self.address_str()
68    }
69
70    #[inline]
71    pub fn set_address(&mut self, value: Address) -> &mut Self {
72        self.address = value;
73        self.string_value.remove_value();
74        self
75    }
76
77    #[inline]
78    pub fn set_string_value<S: Into<String>>(&mut self, value: S) -> &mut Self {
79        self.address = Address::default();
80        self.string_value.set_value(value);
81        self
82    }
83
84    #[inline]
85    pub fn set_address_str<S: Into<String>>(&mut self, value: S) -> &mut Self {
86        let value = value.into();
87        if is_address(&value) {
88            self.address.set_address(value);
89        } else {
90            self.set_string_value(value);
91        }
92        self
93    }
94
95    pub(crate) fn set_attributes<R: std::io::BufRead>(
96        &mut self,
97        reader: &mut Reader<R>,
98        e: &BytesStart,
99    ) {
100        let mut buf = Vec::new();
101        let text = reader
102                    .read_text_into(e.name(), &mut buf).unwrap();
103        self.set_address_str(crate::helper::utils::unescape_xml_text(&text));
104    }
105
106    #[inline]
107    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
108        // formula
109        write_start_tag(writer, "formula", vec![], false);
110        write_text_node(writer, self.address_str());
111        write_end_tag(writer, "formula");
112    }
113}