react/event/
synthetic.rs

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}