wasm-css 0.2.0

Ergonomic WASM CSS Framework
Documentation
// Authors: Robert Lopez

use super::Style;
use crate::error::WasmCssError;

impl Style {
    /// Remove `keys` from `Style`, re-rendering if at-least one key is removed.
    ///
    /// Returns error if missing access to: `Head`, `Window`, `Document`.
    ///
    /// ---
    /// Example Usage:
    /// ```
    ///
    /// let mut style = named_style!(
    ///     "my_style",
    ///     "
    ///         font-size: 18px;
    ///
    ///         &:hover {{
    ///             background-color: red;
    ///         }}
    ///
    ///         background-color: blue;
    ///     "
    /// )?;
    ///
    /// style.remove_keys(vec!["font-size", "&:hover"])?;
    /// ```
    pub fn remove_keys<K: Into<String>>(&mut self, keys: Vec<K>) -> Result<(), WasmCssError> {
        let mut mutated = false;

        for key in keys {
            let (key, is_effect) = unsafe {
                let mut formatted_key_bytes = b"\t".to_vec();
                let mut key_string = key.into();
                let is_effect = key_string.starts_with('@') || key_string.starts_with('&');
                let mut ending_bytes = if is_effect {
                    b" {\n".to_vec()
                } else {
                    b": ".to_vec()
                };

                formatted_key_bytes.append(key_string.as_mut_vec());
                formatted_key_bytes.append(&mut ending_bytes);

                (String::from_utf8_unchecked(formatted_key_bytes), is_effect)
            };

            if is_effect {
                for index in 0..self.components.effects.len() {
                    if self.components.effects[index].key == key {
                        self.components.effects.remove(index);
                        mutated = true;
                        break;
                    }
                }
            } else if self.components.fields.remove(&key).is_some() {
                mutated = true;
            }
        }

        if mutated {
            self.css = self.components.to_css(&self.css_name);
            self.render()?;
        }

        Ok(())
    }
}