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::BytesStart,
7};
8
9// c:f
10use 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        // c:f
101        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}