use std::error::Error; use async_trait::async_trait; use web_sys::{CanvasRenderingContext2d, HtmlCanvasElement}; use crate::rendering::Renderer; use wasm_bindgen::JsCast; pub struct WebRenderer { canvas: HtmlCanvasElement, context: CanvasRenderingContext2d } #[async_trait] impl Renderer for WebRenderer { async fn get(canvas_element_id: &str) -> Result> { let window = web_sys::window().ok_or("window needs to exist")?; let document = window.document().ok_or("window.document needs to exist")?; let canvas_element = document.get_element_by_id(canvas_element_id).ok_or("canvas element does not exist")?; let typed_canvas_element: HtmlCanvasElement = canvas_element.dyn_into::().map_err(|_| ()).unwrap(); let context = typed_canvas_element.get_context("2d").unwrap().unwrap().dyn_into::().unwrap(); Ok(Self { canvas: typed_canvas_element, context }) } }