rpgx_wasm/eucl/
rect.rs

1use crate::prelude::{WasmCoordinates, WasmShape};
2use rpgx::prelude::Rect;
3use wasm_bindgen::prelude::*;
4
5#[wasm_bindgen(js_name = Rect)]
6#[derive(Clone, Debug, PartialEq, Eq)]
7pub struct WasmRect {
8    inner: Rect,
9}
10
11#[wasm_bindgen(js_class = Rect)]
12impl WasmRect {
13    #[wasm_bindgen(constructor)]
14    pub fn new(origin: &WasmCoordinates, shape: &WasmShape) -> WasmRect {
15        WasmRect {
16            inner: Rect::new(origin.inner().clone(), *shape.inner()),
17        }
18    }
19
20    #[wasm_bindgen(js_name = fromShape)]
21    pub fn from_shape(shape: &WasmShape) -> WasmRect {
22        WasmRect {
23            inner: Rect::from_shape(*shape.inner()),
24        }
25    }
26
27    #[wasm_bindgen(js_name = fromOrigin)]
28    pub fn from_origin(origin: &WasmCoordinates) -> WasmRect {
29        WasmRect {
30            inner: Rect::from_origin(origin.inner().clone()),
31        }
32    }
33
34    #[wasm_bindgen(js_name = fromXYWH)]
35    pub fn from_xywh(x: u32, y: u32, width: u32, height: u32) -> WasmRect {
36        WasmRect {
37            inner: Rect::from_xywh(x, y, width, height),
38        }
39    }
40
41    #[wasm_bindgen(js_name = fromMany)]
42    pub fn from_many(rects: Vec<WasmRect>) -> Result<WasmRect, JsValue> {
43        let inner_rects: Vec<Rect> = rects.into_iter().map(|r| r.inner).collect();
44        match Rect::from_many(inner_rects) {
45            Ok(rect) => Ok(WasmRect { inner: rect }),
46            _ => Err(JsValue::from_str("RectError::EmptyRectList")),
47        }
48    }
49
50    #[wasm_bindgen(getter)]
51    pub fn origin(&self) -> WasmCoordinates {
52        WasmCoordinates::from_inner(self.inner.origin)
53    }
54
55    #[wasm_bindgen(getter)]
56    pub fn shape(&self) -> WasmShape {
57        WasmShape::from_inner(self.inner.shape)
58    }
59
60    #[wasm_bindgen(js_name = asMany)]
61    pub fn as_many(&self) -> Vec<WasmRect> {
62        self.inner
63            .as_many()
64            .into_iter()
65            .map(|r| WasmRect { inner: r })
66            .collect()
67    }
68
69    #[wasm_bindgen(js_name = asBlock)]
70    pub fn as_block(&self) -> Vec<WasmRect> {
71        self.inner
72            .as_block()
73            .into_iter()
74            .map(|r| WasmRect { inner: r })
75            .collect()
76    }
77
78    #[wasm_bindgen(js_name = asPerimeter)]
79    pub fn as_perimeter(&self, offset: u32, size: u32) -> Vec<WasmRect> {
80        self.inner
81            .as_perimeter(offset, size)
82            .into_iter()
83            .map(|r| WasmRect { inner: r })
84            .collect()
85    }
86
87    #[wasm_bindgen(js_name = asBisector)]
88    pub fn as_bisector(&self, offset: u32, size: u32) -> Vec<WasmRect> {
89        self.inner
90            .as_bisector(offset, size)
91            .into_iter()
92            .map(|r| WasmRect { inner: r })
93            .collect()
94    }
95
96    #[wasm_bindgen(js_name = asCenter)]
97    pub fn as_center(&self, offset: u32, size: u32) -> Vec<WasmRect> {
98        self.inner
99            .as_center(offset, size)
100            .into_iter()
101            .map(|r| WasmRect { inner: r })
102            .collect()
103    }
104
105    #[wasm_bindgen(js_name = asRhombus)]
106    pub fn as_rhombus(&self, dial: u32) -> Vec<WasmRect> {
107        self.inner
108            .as_rhombus(dial)
109            .into_iter()
110            .map(|r| WasmRect { inner: r })
111            .collect()
112    }
113
114    #[wasm_bindgen(js_name = asCircle)]
115    pub fn as_circle(&self) -> Vec<WasmRect> {
116        self.inner
117            .as_circle()
118            .into_iter()
119            .map(|r| WasmRect { inner: r })
120            .collect()
121    }
122
123    #[wasm_bindgen(js_name = asOdds)]
124    pub fn as_odds(&self) -> Vec<WasmRect> {
125        self.inner
126            .as_odds()
127            .into_iter()
128            .map(|r| WasmRect { inner: r })
129            .collect()
130    }
131
132    #[wasm_bindgen(js_name = asEvens)]
133    pub fn as_evens(&self) -> Vec<WasmRect> {
134        self.inner
135            .as_evens()
136            .into_iter()
137            .map(|r| WasmRect { inner: r })
138            .collect()
139    }
140
141    #[wasm_bindgen]
142    pub fn intersects(&self, other: &WasmRect) -> bool {
143        self.inner.intersects(&other.inner)
144    }
145
146    #[wasm_bindgen]
147    pub fn intersection(&self, other: &WasmRect) -> Option<WasmRect> {
148        self.inner
149            .intersection(&other.inner)
150            .map(|r| WasmRect { inner: r })
151    }
152}
153
154// Internal Rust API
155impl WasmRect {
156    pub fn from_inner(inner: Rect) -> Self {
157        WasmRect { inner }
158    }
159
160    pub fn inner(&self) -> &Rect {
161        &self.inner
162    }
163
164    pub fn into_inner(self) -> Rect {
165        self.inner
166    }
167}