Skip to main content

vertigo/dom/
dom_text.rs

1use crate::{
2    computed::{DropResource, ToComputed, struct_mut::VecMut},
3    driver_module::get_driver_dom,
4};
5
6use super::dom_id::DomId;
7
8/// A Real DOM representative - text kind
9pub struct DomText {
10    id_dom: DomId,
11    subscriptions: VecMut<DropResource>,
12}
13
14impl DomText {
15    pub fn new(value: impl Into<String>) -> DomText {
16        let value = value.into();
17        let id = DomId::default();
18
19        get_driver_dom().create_text(id, &value);
20
21        DomText {
22            id_dom: id,
23            subscriptions: VecMut::new(),
24        }
25    }
26
27    pub fn new_computed<T: Into<String> + Clone + PartialEq + 'static>(
28        computed: impl ToComputed<T>,
29    ) -> Self {
30        let text_node = DomText::new(String::new());
31        let id_dom = text_node.id_dom;
32
33        let computed = computed.to_computed();
34        let client = computed.subscribe(move |value| {
35            let value: String = value.into();
36            get_driver_dom().update_text(id_dom, &value);
37        });
38
39        text_node.subscriptions.push(client);
40        text_node
41    }
42
43    pub fn id_dom(&self) -> DomId {
44        self.id_dom
45    }
46
47    pub fn append_drop_resource(&self, resource: DropResource) {
48        self.subscriptions.push(resource);
49    }
50}
51
52impl Drop for DomText {
53    fn drop(&mut self) {
54        get_driver_dom().remove_text(self.id_dom);
55    }
56}