use std::error::Error;
use async_trait::async_trait;
use web_sys::{CanvasRenderingContext2d, HtmlCanvasElement};
use crate::rendering::Renderer;
use wasm_bindgen::JsCast;
use crate::CLIENT;
#[derive(Debug)]
pub struct WebRenderer {
canvas_element_id: String
}
#[async_trait]
impl Renderer for WebRenderer {
async fn get(canvas_element_id: &str) -> Result<Self, Box<dyn Error>> {
Ok(Self {
canvas_element_id: canvas_element_id.to_string()
})
}
async fn render_frame(&self, time_delta_ms: f64) -> Result<(), Box<dyn Error>> {
// TODO
// time_delta_ms is the delta, in ms, from when the last render_frame was called by the browser
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(&self.canvas_element_id).ok_or("canvas element does not exist")?;
let typed_canvas_element: HtmlCanvasElement = canvas_element.dyn_into::<web_sys::HtmlCanvasElement>().map_err(|_| ()).unwrap();
let context = typed_canvas_element.get_context("2d").unwrap().unwrap().dyn_into::<CanvasRenderingContext2d>().unwrap();
let client = CLIENT.read()?;
Ok(())
}
}