umya_spreadsheet/structs/drawing/charts/
string_cache.rs

1use crate::drawing::charts::Formula;
2// c:strCache
3use crate::reader::driver::*;
4use crate::structs::Address;
5use crate::structs::Spreadsheet;
6use crate::writer::driver::*;
7use crate::CellValue;
8use quick_xml::events::{BytesStart, Event};
9use quick_xml::Reader;
10use quick_xml::Writer;
11use std::io::Cursor;
12
13#[derive(Clone, Default, Debug)]
14pub struct StringCache {}
15
16impl StringCache {
17    pub(crate) fn set_attributes<R: std::io::BufRead>(
18        &mut self,
19        reader: &mut Reader<R>,
20        _e: &BytesStart,
21    ) {
22        xml_read_loop!(
23            reader,
24            Event::End(ref e) => {
25                if e.name().0 == b"c:strCache" {
26                    return;
27                }
28            },
29            Event::Eof => panic!("Error: Could not find {} end element", "c:strCache")
30        );
31    }
32
33    pub(crate) fn write_to(
34        &self,
35        writer: &mut Writer<Cursor<Vec<u8>>>,
36        formula: &Formula,
37        spreadsheet: &Spreadsheet,
38    ) {
39        let mut cell = CellValue::default();
40        let cell_value_list = match formula.has_string_value() {
41            true => {
42                cell.set_value(formula.get_address_str());
43                vec![&cell]
44            }
45            false => spreadsheet.get_cell_value_by_address_crate(formula.get_address()),
46        };
47        let coll_value_count = cell_value_list.len().to_string();
48        // c:strCache
49        write_start_tag(writer, "c:strCache", vec![], false);
50
51        // c:ptCount
52        write_start_tag(writer, "c:ptCount", vec![("val", &coll_value_count)], true);
53
54        for (idx, cell_value) in cell_value_list.into_iter().enumerate() {
55            // c:pt
56            write_start_tag(writer, "c:pt", vec![("idx", &idx.to_string())], false);
57
58            // c:v
59            write_start_tag(writer, "c:v", vec![], false);
60            write_text_node(writer, cell_value.get_value());
61            write_end_tag(writer, "c:v");
62
63            write_end_tag(writer, "c:pt");
64        }
65
66        write_end_tag(writer, "c:strCache");
67    }
68}