umya_spreadsheet/structs/drawing/charts/
formula.rs

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