umya_spreadsheet/structs/drawing/charts/
formula.rs1use std::io::Cursor;
2
3use quick_xml::{
4 Reader,
5 Writer,
6 events::BytesStart,
7};
8
9use super::super::super::Address;
11use super::super::super::StringValue;
12use crate::{
13 helper::address::is_address,
14 traits::AdjustmentCoordinateWithSheet,
15 writer::driver::{
16 write_end_tag,
17 write_start_tag,
18 write_text_node_no_escape,
19 },
20};
21
22#[derive(Clone, Default, Debug)]
23pub struct Formula {
24 address: Address,
25 string_value: StringValue,
26}
27
28impl Formula {
29 #[must_use]
30 pub fn address(&self) -> &Address {
31 &self.address
32 }
33
34 #[must_use]
35 #[deprecated(since = "3.0.0", note = "Use address()")]
36 pub fn get_address(&self) -> &Address {
37 self.address()
38 }
39
40 pub fn address_mut(&mut self) -> &mut Address {
41 &mut self.address
42 }
43
44 #[deprecated(since = "3.0.0", note = "Use address_mut()")]
45 pub fn get_address_mut(&mut self) -> &mut Address {
46 self.address_mut()
47 }
48
49 #[must_use]
50 pub fn address_str(&self) -> String {
51 if self.string_value.has_value() {
52 return self.string_value.value_str().to_string();
53 }
54 self.address.address()
55 }
56
57 #[must_use]
58 #[deprecated(since = "3.0.0", note = "Use address_str()")]
59 pub fn get_address_str(&self) -> String {
60 self.address_str()
61 }
62
63 pub fn set_address(&mut self, value: Address) -> &mut Self {
64 self.address = value;
65 self.string_value.remove_value();
66 self
67 }
68
69 pub fn set_string_value<S: Into<String>>(&mut self, value: S) -> &mut Self {
70 self.address = Address::default();
71 self.string_value.set_value(value);
72 self
73 }
74
75 pub(crate) fn has_string_value(&self) -> bool {
76 self.string_value.has_value()
77 }
78
79 pub fn set_address_str<S: Into<String>>(&mut self, value: S) -> &mut Self {
80 let value = value.into();
81 if is_address(&value) {
82 self.address.set_address(value);
83 } else {
84 self.set_string_value(value);
85 }
86 self
87 }
88
89 pub(crate) fn set_attributes<R: std::io::BufRead>(
90 &mut self,
91 reader: &mut Reader<R>,
92 e: &BytesStart,
93 ) {
94 let mut buf = Vec::new();
95 let text = reader.read_text_into(e.name(), &mut buf).unwrap();
96 self.set_address_str(crate::helper::utils::unescape_xml_text(&text));
97 }
98
99 pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
100 write_start_tag(writer, "c:f", vec![], false);
102 write_text_node_no_escape(writer, self.address_str());
103 write_end_tag(writer, "c:f");
104 }
105}
106impl AdjustmentCoordinateWithSheet for Formula {
107 fn adjustment_insert_coordinate_with_sheet(
108 &mut self,
109 sheet_name: &str,
110 root_col_num: u32,
111 offset_col_num: u32,
112 root_row_num: u32,
113 offset_row_num: u32,
114 ) {
115 self.address.adjustment_insert_coordinate_with_sheet(
116 sheet_name,
117 root_col_num,
118 offset_col_num,
119 root_row_num,
120 offset_row_num,
121 );
122 }
123
124 fn adjustment_remove_coordinate_with_sheet(
125 &mut self,
126 sheet_name: &str,
127 root_col_num: u32,
128 offset_col_num: u32,
129 root_row_num: u32,
130 offset_row_num: u32,
131 ) {
132 self.address.adjustment_remove_coordinate_with_sheet(
133 sheet_name,
134 root_col_num,
135 offset_col_num,
136 root_row_num,
137 offset_row_num,
138 );
139 }
140}