use std::str::FromStr; use chrono::Locale; use gloo::utils::document; use wasm_bindgen::prelude::*; use web_sys::Element; pub trait SelectorExt { fn selector(&self, selectors: &str) -> T where T: JsCast; fn selector_all(&self, selectors: &str) -> Vec where T: JsCast; fn deep_clone(&self) -> Self; } impl SelectorExt for Element { fn selector(&self, selectors: &str) -> T where T: JsCast, { self.query_selector(selectors) .unwrap() .unwrap() .dyn_into::() .unwrap() } fn selector_all(&self, selectors: &str) -> Vec where T: JsCast, { self.query_selector_all(selectors) .unwrap() .values() .into_iter() .map(|e| e.unwrap().dyn_into::().unwrap()) .collect() } fn deep_clone(&self) -> Self { self.clone_node_with_deep(true) .unwrap() .dyn_into::() .unwrap() } } pub fn selector(selectors: &str) -> T where T: JsCast, { document() .query_selector(selectors) .unwrap() .unwrap() .dyn_into::() .unwrap() } pub fn selector_all(selectors: &str) -> Vec where T: JsCast, { document() .query_selector_all(selectors) .unwrap() .values() .into_iter() .map(|e| e.unwrap().dyn_into::().unwrap()) .collect() } pub fn selector_and_clone(selectors: &str) -> T where T: JsCast, { document() .query_selector(selectors) .unwrap() .unwrap() .clone_node_with_deep(true) .unwrap() .dyn_into::() .unwrap() } pub fn by_id(element_id: &str) -> T where T: JsCast, { document() .get_element_by_id(element_id) .unwrap() .dyn_into::() .unwrap() } pub fn get_current_lang() -> String { selector::("html") .get_attribute("lang") .unwrap() .split("-") .next() .unwrap() .to_string() } pub fn get_locale() -> Locale { let lang_and_territory = selector::("html") .get_attribute("lang") .unwrap() .replace("-", "_"); Locale::from_str(&lang_and_territory).unwrap_or_default() }