umya_spreadsheet/structs/
protection.rs

1// protection
2use super::BooleanValue;
3use crate::reader::driver::*;
4use crate::writer::driver::*;
5use md5::Digest;
6use quick_xml::events::BytesStart;
7use quick_xml::Reader;
8use quick_xml::Writer;
9use std::io::Cursor;
10
11#[derive(Default, Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
12pub struct Protection {
13    locked: BooleanValue,
14    hidden: BooleanValue,
15}
16
17impl Protection {
18    #[inline]
19    pub fn get_locked(&self) -> &bool {
20        self.locked.get_value()
21    }
22
23    #[inline]
24    pub fn set_locked(&mut self, value: bool) {
25        self.locked.set_value(value);
26    }
27
28    #[inline]
29    pub fn get_hidden(&mut self) -> &bool {
30        self.hidden.get_value()
31    }
32
33    #[inline]
34    pub fn set_hidden(&mut self, value: bool) {
35        self.hidden.set_value(value);
36    }
37
38    #[inline]
39    pub(crate) fn get_hash_code(&self) -> String {
40        format!(
41            "{:x}",
42            md5::Md5::digest(format!(
43                "{}{}",
44                &self.locked.get_hash_string(),
45                &self.hidden.get_hash_string()
46            ))
47        )
48    }
49
50    #[inline]
51    pub(crate) fn set_attributes<R: std::io::BufRead>(
52        &mut self,
53        _reader: &mut Reader<R>,
54        e: &BytesStart,
55    ) {
56        set_string_from_xml!(self, e, locked, "locked");
57        set_string_from_xml!(self, e, hidden, "hidden");
58    }
59
60    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
61        // protection
62        let mut attributes: Vec<(&str, &str)> = Vec::new();
63        if self.locked.has_value() {
64            attributes.push(("locked", self.locked.get_value_string()));
65        }
66        if self.hidden.has_value() {
67            attributes.push(("hidden", self.hidden.get_value_string()));
68        }
69        write_start_tag(writer, "protection", attributes, true);
70    }
71}