wasm_css/remove_keys.rs
1// Authors: Robert Lopez
2
3use super::Style;
4use crate::error::WasmCssError;
5
6impl Style {
7 /// Remove `keys` from `Style`, re-rendering if at-least one key is removed.
8 ///
9 /// Returns error if missing access to: `Head`, `Window`, `Document`.
10 ///
11 /// ---
12 /// Example Usage:
13 /// ```
14 ///
15 /// let mut style = named_style!(
16 /// "my_style",
17 /// "
18 /// font-size: 18px;
19 ///
20 /// &:hover {{
21 /// background-color: red;
22 /// }}
23 ///
24 /// background-color: blue;
25 /// "
26 /// )?;
27 ///
28 /// style.remove_keys(vec!["font-size", "&:hover"])?;
29 /// ```
30 pub fn remove_keys<K: Into<String>>(&mut self, keys: Vec<K>) -> Result<(), WasmCssError> {
31 let mut mutated = false;
32
33 for key in keys {
34 let (key, is_effect) = unsafe {
35 let mut formatted_key_bytes = b"\t".to_vec();
36 let mut key_string = key.into();
37 let is_effect = key_string.starts_with('@') || key_string.starts_with('&');
38 let mut ending_bytes = if is_effect {
39 b" {\n".to_vec()
40 } else {
41 b": ".to_vec()
42 };
43
44 formatted_key_bytes.append(key_string.as_mut_vec());
45 formatted_key_bytes.append(&mut ending_bytes);
46
47 (String::from_utf8_unchecked(formatted_key_bytes), is_effect)
48 };
49
50 if is_effect {
51 for index in 0..self.components.effects.len() {
52 if self.components.effects[index].key == key {
53 self.components.effects.remove(index);
54 mutated = true;
55 break;
56 }
57 }
58 } else if self.components.fields.remove(&key).is_some() {
59 mutated = true;
60 }
61 }
62
63 if mutated {
64 self.css = self.components.to_css(&self.css_name);
65 self.render()?;
66 }
67
68 Ok(())
69 }
70}