From: Ian Jackson Date: Thu, 25 Mar 2021 11:02:48 +0000 (+0000) Subject: wasm: Provide RegionList X-Git-Tag: otter-0.5.0~430 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=ba41790b4b1be2b947d33ef5db1535b5b51b76cf;p=otter.git wasm: Provide RegionList Signed-off-by: Ian Jackson --- diff --git a/wasm/wasm.rs b/wasm/wasm.rs index 0f0b549b..061bf2be 100644 --- a/wasm/wasm.rs +++ b/wasm/wasm.rs @@ -5,12 +5,16 @@ use otter_base::imports::*; use std::fmt::Display; +use std::collections::hash_map::HashMap; use fehler::throws; use js_sys::JsString; use thiserror::Error; use wasm_bindgen::prelude::*; +use otter_base::imports::serde_json; + +use otter_base::geometry::{PosC,Region}; use otter_base::zcoord; use otter_base::misc as base_misc; use zcoord::{Mutable,ZCoord}; @@ -132,6 +136,51 @@ pub fn angle_transform(angle: u8) -> JsString { base_misc::raw_angle_transform(angle).into() } +// ---------- region ---------- + +#[derive(Error,Clone,Copy,Debug,Eq,PartialEq)] +#[error("region or piece argument not suitable")] +pub struct BadRegionArguments; + +type Number = f64; + +#[wasm_bindgen] +pub struct RegionList(HashMap>); + +#[wasm_bindgen] +pub fn empty_region_list() -> RegionList { RegionList(default()) } + +#[wasm_bindgen] +impl RegionList { + pub fn insert(&mut self, piece: JsValue, region: JsValue) + -> Result<(), JsValue> + { + let piece = piece .as_string().ok_or(BadRegionArguments).e()?; + let region = region.as_string().ok_or(BadRegionArguments).e()?; + let region: Region = serde_json::from_str(®ion) + .map_err(|_| BadRegionArguments).e()?; + self.0.insert(piece, region); + Ok(()) + } + + pub fn remove(&mut self, piece: JsValue) + -> Result<(), JsValue> + { + let piece = piece .as_string().ok_or(BadRegionArguments).e()?; + self.0.remove(&piece); + Ok(()) + } + + pub fn contains_pos(&mut self, x: Number, y: Number) -> bool { + self.0 + .values() + .any( + |r| r.contains(PosC([x,y])) + ) + } +} + + // ---------- setup ---------- #[wasm_bindgen]