here is my rust code:
pub async fn render(&self, canvas_id: &str) -> Result<(), JsValue> {
let viewbox = self.svg_viewbox().await?;
let window = web_sys::window().ok_or_else(|| "Window object not found!")?;
let document = window
.document()
.ok_or_else(|| "Document object not found!")?;
let canvas = document
.get_element_by_id(canvas_id)
.ok_or_else(|| "Canvas object not found!")?
.dyn_into::<web_sys::HtmlCanvasElement>()
.map_err(|err| err.to_string())?;
let context = canvas
.get_context("2d")
.map_err(|err| err)?
.ok_or_else(|| "Context object not found!")?
.dyn_into::<web_sys::CanvasRenderingContext2d>()
.map_err(|err| err.to_string())?;
let img = HtmlImageElement::new()?;
let blob = Blob::new_with_options(self.decrypted_svg.as_str(), Some("image/svg+xml"));
let object_url = ObjectUrl::from(blob);
img.set_src(&object_url);
context.draw_image_with_html_image_element(&img, viewbox[0] * 2.0, viewbox[1] * 2.0)?;
Ok(())
}