vertigo 0.2.0-alpha

Reactive Real-DOM library for Rust
Documentation
use crate::{
    driver_module::driver::Driver,
    dom::dom_id::DomId, get_driver, Client, struct_mut::VecMut, Computed, Value,
};

pub trait ToComputed<T: Clone> {
    fn to_computed_param(&self) -> Computed<T>;
}

impl<T: Clone + 'static> ToComputed<T> for Computed<T> {
    fn to_computed_param(&self) -> Computed<T> {
        self.clone()
    }
}

impl<T: Clone + 'static> ToComputed<T> for &Computed<T> {
    fn to_computed_param(&self) -> Computed<T> {
        (*self).clone()
    }
}

impl<T: Clone + 'static> ToComputed<T> for Value<T> {
    fn to_computed_param(&self) -> Computed<T> {
        self.to_computed()
    }
}

impl<T: Clone + 'static> ToComputed<T> for &Value<T> {
    fn to_computed_param(&self) -> Computed<T> {
        self.to_computed()
    }
}


/// A Real DOM representative - text kind
pub struct DomText {
    driver: Driver,
    id_dom: DomId,
    subscriptions: VecMut<Client>,
}

impl DomText {
    pub fn new(value: impl Into<String>) -> DomText {
        let value = value.into();
        let id = DomId::default();

        let driver = get_driver();
        driver.inner.dom.create_text(id, &value);

        DomText {
            driver,
            id_dom: id,
            subscriptions: VecMut::new(),
        }
    }

    pub fn new_computed<T: Into<String> + Clone + PartialEq + 'static>(computed: impl ToComputed<T>) -> Self {
        let text_node = DomText::new(String::new());
        let id_dom = text_node.id_dom;
        let driver = get_driver();

        let computed = computed.to_computed_param();
        let client = computed.subscribe(move |value| {
            let value: String = value.into();
            driver.inner.dom.update_text(id_dom, &value);
        });

        text_node.subscriptions.push(client);
        text_node
    }

    pub fn id_dom(&self) -> DomId {
        self.id_dom
    }
}

impl Drop for DomText {
    fn drop(&mut self) {
        self.driver.inner.dom.remove_text(self.id_dom);
    }
}