umya_spreadsheet/structs/drawing/charts/
string_cache.rs1use crate::drawing::charts::Formula;
2use 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 write_start_tag(writer, "c:strCache", vec![], false);
50
51 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 write_start_tag(writer, "c:pt", vec![("idx", &idx.to_string())], false);
57
58 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}