Skip to main content

umya_spreadsheet/structs/drawing/charts/
formula.rs

1use std::io::Cursor;
2
3use quick_xml::{
4    Reader,
5    Writer,
6    events::{
7        BytesStart,
8        Event,
9    },
10};
11
12// c:f
13use 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        // c:f
114        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}