1use crate::prelude::{WasmDelta, WasmRect};
2use crate::traits::WasmWrapper;
3use rpgx::prelude::Effect;
4use wasm_bindgen::prelude::*;
5
6#[wasm_bindgen(js_name = Effect)]
7#[derive(Clone, Copy, Debug, PartialEq, Eq)]
8pub struct WasmEffect {
9 inner: Effect,
10}
11
12impl WasmWrapper<Effect> for WasmEffect {
13 fn inner(&self) -> &Effect {
14 &self.inner
15 }
16
17 fn into_inner(self) -> Effect {
18 self.inner
19 }
20
21 fn from_inner(inner: Effect) -> Self {
22 WasmEffect { inner }
23 }
24}
25
26#[wasm_bindgen(js_class = Effect)]
27impl WasmEffect {
28 #[wasm_bindgen(js_name = none)]
31 pub fn none() -> WasmEffect {
32 WasmEffect {
33 inner: Effect::None,
34 }
35 }
36
37 #[wasm_bindgen(js_name = action)]
38 pub fn action(id: u32) -> WasmEffect {
39 WasmEffect {
40 inner: Effect::Action(id),
41 }
42 }
43
44 #[wasm_bindgen(js_name = texture)]
45 pub fn texture(id: u32) -> WasmEffect {
46 WasmEffect {
47 inner: Effect::Texture(id),
48 }
49 }
50
51 #[wasm_bindgen(js_name = render)]
52 pub fn render(id: u32) -> WasmEffect {
53 WasmEffect {
54 inner: Effect::Render(id),
55 }
56 }
57
58 #[wasm_bindgen(js_name = block)]
59 pub fn block(rect: &WasmRect) -> WasmEffect {
60 WasmEffect {
61 inner: Effect::Block(*rect.inner()),
62 }
63 }
64
65 #[wasm_bindgen(js_name = kind)]
68 pub fn kind(&self) -> String {
69 match self.inner {
70 Effect::None => "None",
71 Effect::Action(_) => "Action",
72 Effect::Texture(_) => "Texture",
73 Effect::Render(_) => "Render",
74 Effect::Block(_) => "Block",
75 }
76 .to_string()
77 }
78
79 #[wasm_bindgen(js_name = asAction)]
80 pub fn as_action(&self) -> Option<u32> {
81 if let Effect::Action(id) = self.inner {
82 Some(id)
83 } else {
84 None
85 }
86 }
87
88 #[wasm_bindgen(js_name = asTexture)]
89 pub fn as_texture(&self) -> Option<u32> {
90 if let Effect::Texture(id) = self.inner {
91 Some(id)
92 } else {
93 None
94 }
95 }
96
97 #[wasm_bindgen(js_name = asRender)]
98 pub fn as_render(&self) -> Option<u32> {
99 if let Effect::Render(id) = self.inner {
100 Some(id)
101 } else {
102 None
103 }
104 }
105
106 #[wasm_bindgen(js_name = asBlock)]
107 pub fn as_block(&self) -> Option<WasmRect> {
108 if let Effect::Block(rect) = self.inner {
109 Some(WasmRect::from_inner(rect))
110 } else {
111 None
112 }
113 }
114
115 #[wasm_bindgen]
118 pub fn offset(&mut self, delta: &WasmDelta) {
119 self.inner.offset(*delta.inner());
120 }
121}