Skip to main content

euv_core/renderer/render/
fn.rs

1use crate::*;
2
3/// Mounts the given virtual DOM tree to a specific element matched by a CSS selector.
4///
5/// Supported selector syntax:
6/// - `"#id"` — select by element ID
7/// - `".class"` — select by class name (uses the first match)
8/// - `"tag"` — select by tag name (uses the first match)
9///
10/// # Arguments
11///
12/// - `&str` - A CSS selector string to locate the target element.
13/// - `FnOnce() -> VirtualNode + 'static` - A closure that returns the virtual DOM tree to render.
14///
15pub fn mount<F>(selector: &str, render_fn: F)
16where
17    F: FnOnce() -> VirtualNode,
18{
19    init_event_delegation();
20    let window: Window = match window() {
21        Some(w) => w,
22        None => return,
23    };
24    let document: Document = match window.document() {
25        Some(d) => d,
26        None => return,
27    };
28    let target: Element = if selector == BODY_TAG {
29        match document.body() {
30            Some(body) => body.into(),
31            None => return,
32        }
33    } else if let Some(id) = selector.strip_prefix(ID_SELECTOR_PREFIX) {
34        match document.get_element_by_id(id) {
35            Some(el) => el,
36            None => return,
37        }
38    } else if let Some(class) = selector.strip_prefix(CLASS_SELECTOR_PREFIX) {
39        match document.get_elements_by_class_name(class).item(0) {
40            Some(el) => el,
41            None => return,
42        }
43    } else {
44        match document.get_elements_by_tag_name(selector).item(0) {
45            Some(el) => el,
46            None => return,
47        }
48    };
49    let mut renderer: Renderer = Renderer::new(target);
50    let vnode: VirtualNode = render_fn();
51    renderer.render(vnode);
52}