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
154impl 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}