iweb/
lib.rs

1pub mod fetch;
2pub mod sys;
3pub mod theme;
4
5use js_sys;
6use serde_json;
7use std::time::{Duration, SystemTime, UNIX_EPOCH};
8use wasm_bindgen::prelude::*;
9
10pub fn perf_to_system(amt: f64) -> SystemTime {
11    let secs = (amt as u64) / 1_000;
12    let nanos = (((amt as u64) % 1_000) as u32) * 1_000_000;
13    UNIX_EPOCH + Duration::new(secs, nanos)
14}
15
16pub fn now() -> SystemTime {
17    perf_to_system(js_sys::Date::now())
18}
19
20#[derive(Debug, PartialEq, Clone)]
21pub struct Ele {
22    pub ele: web_sys::HtmlElement,
23}
24
25impl From<web_sys::HtmlElement> for Ele {
26    fn from(e: web_sys::HtmlElement) -> Ele {
27        Ele { ele: e }
28    }
29}
30
31impl From<web_sys::Element> for Ele {
32    fn from(e: web_sys::Element) -> Ele {
33        Ele {
34            ele: web_sys::HtmlElement::from(JsValue::from(e)),
35        }
36    }
37}
38
39impl From<web_sys::Document> for Ele {
40    fn from(e: web_sys::Document) -> Ele {
41        Ele {
42            ele: web_sys::HtmlElement::from(JsValue::from(e)),
43        }
44    }
45}
46
47impl From<web_sys::Node> for Ele {
48    fn from(e: web_sys::Node) -> Ele {
49        Ele {
50            ele: web_sys::HtmlElement::from(JsValue::from(e)),
51        }
52    }
53}
54
55impl From<JsValue> for Ele {
56    fn from(e: JsValue) -> Ele {
57        Ele {
58            ele: web_sys::HtmlElement::from(e),
59        }
60    }
61}
62
63pub fn tag(tag: &str) -> Ele {
64    Ele::from(sys::create_element(tag))
65}
66
67pub fn body() -> Ele {
68    Ele::from(sys::body())
69}
70
71pub fn document() -> Ele {
72    Ele {
73        ele: web_sys::HtmlElement::from(JsValue::from(
74            web_sys::window().unwrap().document().unwrap(),
75        )),
76    }
77}
78
79pub fn get_element_by_id(id: &str) -> Option<Ele> {
80    if let Some(e) = sys::document().get_element_by_id(id) {
81        return Some(Ele::from(e));
82    }
83    None
84}
85
86pub fn log(data: serde_json::Value) {
87    web_sys::console::log_1(&JsValue::from_str(data.to_string().as_str()));
88}
89
90impl Ele {
91    pub fn append(self, node: &Ele) -> Self {
92        if let Err(e) = self.ele.append_child(&node.ele) {
93            web_sys::console::log(&js_sys::Array::from(&e));
94        };
95        self
96    }
97    pub fn query_selector(self, txt: &str) -> Option<Ele> {
98        if let Some(ele) = self.ele.query_selector(txt).expect("query_selecor error") {
99            return Some(Ele::from(ele));
100        }
101        None
102    }
103    pub fn query_selector_all(self, txt: &str) -> Vec<Ele> {
104        let list = self
105            .ele
106            .query_selector_all(txt)
107            .expect("query_selecor error");
108
109        let mut out = Vec::new();
110        for i in 0..list.length() {
111            if let Some(ele) = list.item(i) {
112                out.push(Ele::from(ele));
113            }
114        }
115        out
116    }
117    pub fn text(self, txt: &str) -> Self {
118        self.ele.set_text_content(Some(txt));
119        self
120    }
121    pub fn id(self, txt: &str) -> Self {
122        self.ele.set_id(txt);
123        self
124    }
125    pub fn class(self, txt: &str) -> Self {
126        self.ele.set_class_name(txt);
127        self
128    }
129    pub fn attr(self, name: &str, txt: &str) -> Self {
130        self.ele
131            .set_attribute(name, txt)
132            .expect(format!("can not set attribute: {} {}", name, txt).as_str());
133
134        self
135    }
136    pub fn inner_html(self, txt: &str) -> Self {
137        self.ele.set_inner_html(txt);
138        self
139    }
140    pub fn inner_text(self, txt: &str) -> Self {
141        self.ele.set_inner_text(txt);
142        self
143    }
144}