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