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}