vertigo 0.2.0-alpha

Reactive Real-DOM library for Rust
Documentation
use std::rc::Rc;

use crate::{DomId, Driver, struct_mut::ValueMut};

struct DomElementClassMergeInner {
    driver: Driver,
    id_dom: DomId,
    css_name: Option<String>,
    attr_name: Option<String>,
    command_last_sent: Option<String>,
}

impl DomElementClassMergeInner {
    fn new(driver: Driver, id_dom: DomId) -> Self {
        Self {
            driver,
            id_dom,
            css_name: None,
            attr_name: None,
            command_last_sent: None,
        }
    }

    fn get_new_command(&self) -> Option<String> {
        match (&self.attr_name, &self.css_name) {
            (None, None) => None,
            (Some(attr), None) => Some(attr.clone()),
            (None, Some(css)) => Some(css.clone()),
            (Some(attr), Some(css)) => {
                Some([attr, " ", css].join(""))
            }
        }
    }

    fn refresh_dom(&mut self) {
        let new_command = self.get_new_command();

        if self.command_last_sent != new_command {
            self.command_last_sent = new_command.clone();

            let new_command = match new_command {
                Some(new_command) => new_command,
                None => "".to_string()
            };

            self.driver.inner.dom.set_attr(self.id_dom, "class", &new_command);
        }
    }
}

#[derive(Clone)]
pub struct DomElementClassMerge {
    inner: Rc<ValueMut<DomElementClassMergeInner>>,
}

impl DomElementClassMerge {
    pub fn new(driver: Driver, id_dom: DomId) -> Self {
        Self {
            inner: Rc::new(ValueMut::new(DomElementClassMergeInner::new(driver, id_dom)))
        }
    }

    pub fn set_attribute(&self, new_value: String) {
        self.inner.change(|state| {
            state.attr_name = Some(new_value);
            state.refresh_dom();
        });
    }

    pub fn set_css(&self, new_value: String) {
        self.inner.change(|state| {
            state.css_name = Some(new_value);
            state.refresh_dom();
        });
    }
}