1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use web_sys::HtmlImageElement;
use wasm_bindgen::JsCast;
use js_sys::Promise;
use wasm_bindgen_futures::JsFuture;

#[derive(Debug)]
pub struct Image {
    element: HtmlImageElement,
}

impl Image {
    pub async fn load(url: &str) -> Result<Image, ()> {
        let document = web_sys::window().unwrap().document().unwrap();
        let element = document
            .create_element("img")
            .unwrap()
            .dyn_into::<web_sys::HtmlImageElement>()
            .unwrap();
        element.set_src(url);

        let result = JsFuture::from(Promise::new(&mut |yes, no| {
            element.add_event_listener_with_callback("load", &yes).unwrap();
            element.add_event_listener_with_callback("error", &no).unwrap();
        })).await;

        if result.is_ok() {
            Ok(Image {
                element
            })
        } else {
            Err(())
        }
    }

    pub(crate) fn get_html_element(&self) -> &HtmlImageElement {
        &self.element
    }

    pub fn get_width<T: From<u32>>(&self) -> T {
        self.element.width().into()
    }

    pub fn get_height<T: From<u32>>(&self) -> T {
        self.element.height().into()
    }

    pub fn get_size<T: From<u32>>(&self) -> (T, T) {
        (self.element.width().into(), self.element.height().into())
    }
}