umya_spreadsheet/structs/
formula.rs1use 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 write_start_tag(writer, "formula", vec![], false);
110 write_text_node(writer, self.address_str());
111 write_end_tag(writer, "formula");
112 }
113}