Skip to main content

umya_spreadsheet/structs/drawing/
run.rs

1use std::io::Cursor;
2
3use quick_xml::{
4    Reader,
5    Writer,
6    events::{
7        BytesStart,
8        Event,
9    },
10};
11
12use super::run_properties::RunProperties;
13use crate::{
14    reader::driver::xml_read_loop,
15    writer::driver::{
16        write_end_tag,
17        write_start_tag,
18        write_text_node,
19    },
20};
21
22#[derive(Clone, Default, Debug)]
23pub struct Run {
24    text:           Box<str>,
25    run_properties: RunProperties,
26}
27
28impl Run {
29    #[inline]
30    #[must_use]
31    pub fn text(&self) -> &str {
32        &self.text
33    }
34
35    #[inline]
36    #[must_use]
37    #[deprecated(since = "3.0.0", note = "Use text()")]
38    pub fn get_text(&self) -> &str {
39        self.text()
40    }
41
42    #[inline]
43    pub fn set_text<S: Into<String>>(&mut self, value: S) {
44        self.text = value.into().into_boxed_str();
45    }
46
47    #[inline]
48    #[must_use]
49    pub fn run_properties(&self) -> &RunProperties {
50        &self.run_properties
51    }
52
53    #[inline]
54    #[must_use]
55    #[deprecated(since = "3.0.0", note = "Use run_properties()")]
56    pub fn get_run_properties(&self) -> &RunProperties {
57        self.run_properties()
58    }
59
60    #[inline]
61    pub fn run_properties_mut(&mut self) -> &mut RunProperties {
62        &mut self.run_properties
63    }
64
65    #[inline]
66    #[deprecated(since = "3.0.0", note = "Use run_properties_mut()")]
67    pub fn get_run_properties_mut(&mut self) -> &mut RunProperties {
68        self.run_properties_mut()
69    }
70
71    #[inline]
72    pub fn set_run_properties(&mut self, value: RunProperties) {
73        self.run_properties = value;
74    }
75
76    pub(crate) fn set_attributes<R: std::io::BufRead>(
77        &mut self,
78        reader: &mut Reader<R>,
79        _e: &BytesStart,
80    ) {
81        xml_read_loop!(
82            reader,
83            Event::Start(ref e) => {
84                if e.name().0 == b"a:rPr" {
85                    self.run_properties.set_attributes(reader, e, false);
86                }
87            },
88            Event::Empty(ref e) => {
89                if e.name().0 == b"a:rPr" {
90                    self.run_properties.set_attributes(reader, e, true);
91                }
92            },
93            Event::Text(e) => {
94                self.set_text(e.unescape().unwrap());
95            },
96            Event::End(ref e) => {
97                if e.name().0 == b"a:r" {
98                    return;
99                }
100            },
101            Event::Eof => panic!("Error: Could not find {} end element", "a:r")
102        );
103    }
104
105    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
106        // a:r
107        write_start_tag(writer, "a:r", vec![], false);
108
109        // a:rPr
110        self.run_properties.write_to_rpr(writer);
111
112        // a:t
113        write_start_tag(writer, "a:t", vec![], false);
114        write_text_node(writer, &*self.text);
115        write_end_tag(writer, "a:t");
116
117        write_end_tag(writer, "a:r");
118    }
119}