iweb 0.1.0

Use web_sys like call link
Documentation
pub mod fetch;
pub mod sys;
pub mod theme;

use js_sys;
use serde_json;
use std::time::{Duration, SystemTime, UNIX_EPOCH};
use wasm_bindgen::prelude::*;

pub fn perf_to_system(amt: f64) -> SystemTime {
    let secs = (amt as u64) / 1_000;
    let nanos = (((amt as u64) % 1_000) as u32) * 1_000_000;
    UNIX_EPOCH + Duration::new(secs, nanos)
}

pub fn now() -> SystemTime {
    perf_to_system(js_sys::Date::now())
}

#[derive(Debug, PartialEq, Clone)]
pub struct Ele {
    pub ele: web_sys::HtmlElement,
}

impl From<web_sys::HtmlElement> for Ele {
    fn from(e: web_sys::HtmlElement) -> Ele {
        Ele { ele: e }
    }
}

impl From<web_sys::Element> for Ele {
    fn from(e: web_sys::Element) -> Ele {
        Ele {
            ele: web_sys::HtmlElement::from(JsValue::from(e)),
        }
    }
}

impl From<web_sys::Document> for Ele {
    fn from(e: web_sys::Document) -> Ele {
        Ele {
            ele: web_sys::HtmlElement::from(JsValue::from(e)),
        }
    }
}

impl From<web_sys::Node> for Ele {
    fn from(e: web_sys::Node) -> Ele {
        Ele {
            ele: web_sys::HtmlElement::from(JsValue::from(e)),
        }
    }
}

impl From<JsValue> for Ele {
    fn from(e: JsValue) -> Ele {
        Ele {
            ele: web_sys::HtmlElement::from(e),
        }
    }
}

pub fn tag(tag: &str) -> Ele {
    Ele::from(sys::create_element(tag))
}

pub fn body() -> Ele {
    Ele::from(sys::body())
}

pub fn document() -> Ele {
    Ele {
        ele: web_sys::HtmlElement::from(JsValue::from(
            web_sys::window().unwrap().document().unwrap(),
        )),
    }
}

pub fn get_element_by_id(id: &str) -> Option<Ele> {
    if let Some(e) = sys::document().get_element_by_id(id) {
        return Some(Ele::from(e));
    }
    None
}

pub fn log(data: serde_json::Value) {
    web_sys::console::log_1(&JsValue::from_str(data.to_string().as_str()));
}

impl Ele {
    pub fn append(self, node: &Ele) -> Self {
        if let Err(e) = self.ele.append_child(&node.ele) {
            web_sys::console::log(&js_sys::Array::from(&e));
        };
        self
    }
    pub fn query_selector(self, txt: &str) -> Option<Ele> {
        if let Some(ele) = self.ele.query_selector(txt).expect("query_selecor error") {
            return Some(Ele::from(ele));
        }
        None
    }
    pub fn query_selector_all(self, txt: &str) -> Vec<Ele> {
        let list = self
            .ele
            .query_selector_all(txt)
            .expect("query_selecor error");

        let mut out = Vec::new();
        for i in 0..list.length() {
            if let Some(ele) = list.item(i) {
                out.push(Ele::from(ele));
            }
        }
        out
    }
    pub fn text(self, txt: &str) -> Self {
        self.ele.set_text_content(Some(txt));
        self
    }
    pub fn id(self, txt: &str) -> Self {
        self.ele.set_id(txt);
        self
    }
    pub fn class(self, txt: &str) -> Self {
        self.ele.set_class_name(txt);
        self
    }
    pub fn attr(self, name: &str, txt: &str) -> Self {
        self.ele
            .set_attribute(name, txt)
            .expect(format!("can not set attribute: {} {}", name, txt).as_str());

        self
    }
    pub fn inner_html(self, txt: &str) -> Self {
        self.ele.set_inner_html(txt);
        self
    }
    pub fn inner_text(self, txt: &str) -> Self {
        self.ele.set_inner_text(txt);
        self
    }
}