1use convert_js::FromJs;
2use std::{convert::Infallible, marker::PhantomData, ops::Deref};
3use wasm_bindgen::{JsCast, JsValue};
4
5use super::js;
6
7pub struct SyntheticEvent<
8 TCurrent = js::native::Element,
9 TNativeEvent = js::native::Event,
10 TBaseSyntheticEvent = js::BaseSyntheticEvent,
11> {
12 base: TBaseSyntheticEvent,
13 _phantom: PhantomData<(TCurrent, TNativeEvent)>,
14}
15
16impl<TCurrent, TNativeEvent, TBaseSyntheticEvent: PartialEq> PartialEq
17 for SyntheticEvent<TCurrent, TNativeEvent, TBaseSyntheticEvent>
18{
19 fn eq(&self, other: &Self) -> bool {
20 self.base == other.base
21 }
22}
23
24impl<TCurrent, TNativeEvent, TBaseSyntheticEvent: Eq> Eq
25 for SyntheticEvent<TCurrent, TNativeEvent, TBaseSyntheticEvent>
26{
27}
28
29impl<TCurrent, TNativeEvent, TBaseSyntheticEvent: std::fmt::Debug> std::fmt::Debug
30 for SyntheticEvent<TCurrent, TNativeEvent, TBaseSyntheticEvent>
31{
32 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33 f.debug_struct(&format!(
34 "SyntheticEvent<{}>",
35 std::any::type_name::<TBaseSyntheticEvent>()
36 ))
37 .field("event", &self.base)
38 .field("current_target", &std::any::type_name::<TCurrent>())
39 .field("native_event", &std::any::type_name::<TNativeEvent>())
40 .finish()
41 }
42}
43
44impl<TCurrent, TNativeEvent, TBaseSyntheticEvent: Clone> Clone
45 for SyntheticEvent<TCurrent, TNativeEvent, TBaseSyntheticEvent>
46{
47 fn clone(&self) -> Self {
48 Self {
49 base: self.base.clone(),
50 _phantom: self._phantom,
51 }
52 }
53}
54
55impl<TCurrent, TNativeEvent, TBaseSyntheticEvent: JsCast> FromJs
56 for SyntheticEvent<TCurrent, TNativeEvent, TBaseSyntheticEvent>
57{
58 type Error = Infallible;
59
60 fn from_js(js_value: JsValue) -> Result<Self, Self::Error> {
61 let base = js_value.unchecked_into();
62 Ok(Self {
63 base,
64 _phantom: PhantomData,
65 })
66 }
67}
68
69impl<TCurrent, TNativeEvent, TBaseSyntheticEvent> Deref
70 for SyntheticEvent<TCurrent, TNativeEvent, TBaseSyntheticEvent>
71{
72 type Target = TBaseSyntheticEvent;
73
74 fn deref(&self) -> &Self::Target {
75 &self.base
76 }
77}
78
79impl<TCurrent, TNativeEvent, TBaseSyntheticEvent: AsRef<js::BaseSyntheticEvent>>
80 SyntheticEvent<TCurrent, TNativeEvent, TBaseSyntheticEvent>
81{
82 pub fn native_event(&self) -> TNativeEvent
83 where
84 TNativeEvent: JsCast,
85 {
86 let raw = self.base.as_ref().native_event_raw();
87 raw.unchecked_into()
88 }
89
90 pub fn current_target(&self) -> TCurrent
91 where
92 TCurrent: JsCast,
93 {
94 let raw = self.base.as_ref().current_target_raw();
95 raw.unchecked_into()
96 }
97}