1use crate::{
2 computed::{DropResource, ToComputed, struct_mut::VecMut},
3 driver_module::get_driver_dom,
4};
5
6use super::dom_id::DomId;
7
8pub 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}