Skip to main content

euv_core/event/name/
impl.rs

1use crate::*;
2
3/// Implements `Display` for `NativeEventName` to provide string representation.
4///
5/// This also provides `ToString::to_string()` via the standard blanket implementation,
6/// which is the preferred way to obtain the event name as a `String`.
7impl Display for NativeEventName {
8    /// Formats this event name as a string.
9    ///
10    /// # Arguments
11    ///
12    /// - `&mut Formatter<'_>`- The formatter.
13    ///
14    /// # Returns
15    ///
16    /// - `fmt::Result`- The formatting result.
17    fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
18        match self {
19            NativeEventName::Click => write!(formatter, "{EVENT_NAME_CLICK}"),
20            NativeEventName::DblClick => write!(formatter, "{EVENT_NAME_DBLCLICK}"),
21            NativeEventName::MouseDown => write!(formatter, "{EVENT_NAME_MOUSEDOWN}"),
22            NativeEventName::MouseUp => write!(formatter, "{EVENT_NAME_MOUSEUP}"),
23            NativeEventName::MouseMove => write!(formatter, "{EVENT_NAME_MOUSEMOVE}"),
24            NativeEventName::MouseEnter => write!(formatter, "{EVENT_NAME_MOUSEENTER}"),
25            NativeEventName::MouseLeave => write!(formatter, "{EVENT_NAME_MOUSELEAVE}"),
26            NativeEventName::MouseOver => write!(formatter, "{EVENT_NAME_MOUSEOVER}"),
27            NativeEventName::MouseOut => write!(formatter, "{EVENT_NAME_MOUSEOUT}"),
28            NativeEventName::ContextMenu => write!(formatter, "{EVENT_NAME_CONTEXTMENU}"),
29            NativeEventName::Input => write!(formatter, "{EVENT_NAME_INPUT}"),
30            NativeEventName::KeyDown => write!(formatter, "{EVENT_NAME_KEYDOWN}"),
31            NativeEventName::KeyUp => write!(formatter, "{EVENT_NAME_KEYUP}"),
32            NativeEventName::KeyPress => write!(formatter, "{EVENT_NAME_KEYPRESS}"),
33            NativeEventName::Focus => write!(formatter, "{EVENT_NAME_FOCUS}"),
34            NativeEventName::Blur => write!(formatter, "{EVENT_NAME_BLUR}"),
35            NativeEventName::FocusIn => write!(formatter, "{EVENT_NAME_FOCUSIN}"),
36            NativeEventName::FocusOut => write!(formatter, "{EVENT_NAME_FOCUSOUT}"),
37            NativeEventName::Submit => write!(formatter, "{EVENT_NAME_SUBMIT}"),
38            NativeEventName::Change => write!(formatter, "{EVENT_NAME_CHANGE}"),
39            NativeEventName::Drag => write!(formatter, "{EVENT_NAME_DRAG}"),
40            NativeEventName::DragStart => write!(formatter, "{EVENT_NAME_DRAGSTART}"),
41            NativeEventName::DragEnd => write!(formatter, "{EVENT_NAME_DRAGEND}"),
42            NativeEventName::DragOver => write!(formatter, "{EVENT_NAME_DRAGOVER}"),
43            NativeEventName::DragEnter => write!(formatter, "{EVENT_NAME_DRAGENTER}"),
44            NativeEventName::DragLeave => write!(formatter, "{EVENT_NAME_DRAGLEAVE}"),
45            NativeEventName::Drop => write!(formatter, "{EVENT_NAME_DROP}"),
46            NativeEventName::TouchStart => write!(formatter, "{EVENT_NAME_TOUCHSTART}"),
47            NativeEventName::TouchEnd => write!(formatter, "{EVENT_NAME_TOUCHEND}"),
48            NativeEventName::TouchMove => write!(formatter, "{EVENT_NAME_TOUCHMOVE}"),
49            NativeEventName::TouchCancel => write!(formatter, "{EVENT_NAME_TOUCHCANCEL}"),
50            NativeEventName::Wheel => write!(formatter, "{EVENT_NAME_WHEEL}"),
51            NativeEventName::Copy => write!(formatter, "{EVENT_NAME_COPY}"),
52            NativeEventName::Cut => write!(formatter, "{EVENT_NAME_CUT}"),
53            NativeEventName::Paste => write!(formatter, "{EVENT_NAME_PASTE}"),
54            NativeEventName::Play => write!(formatter, "{EVENT_NAME_PLAY}"),
55            NativeEventName::Pause => write!(formatter, "{EVENT_NAME_PAUSE}"),
56            NativeEventName::Ended => write!(formatter, "{EVENT_NAME_ENDED}"),
57            NativeEventName::LoadedData => write!(formatter, "{EVENT_NAME_LOADEDDATA}"),
58            NativeEventName::CanPlay => write!(formatter, "{EVENT_NAME_CANPLAY}"),
59            NativeEventName::VolumeChange => write!(formatter, "{EVENT_NAME_VOLUMECHANGE}"),
60            NativeEventName::TimeUpdate => write!(formatter, "{EVENT_NAME_TIMEUPDATE}"),
61            NativeEventName::HashChange => write!(formatter, "{EVENT_NAME_HASHCHANGE}"),
62            NativeEventName::PopState => write!(formatter, "{EVENT_NAME_POPSTATE}"),
63            NativeEventName::Resize => write!(formatter, "{EVENT_NAME_RESIZE}"),
64            NativeEventName::Scroll => write!(formatter, "{EVENT_NAME_SCROLL}"),
65            NativeEventName::Load => write!(formatter, "{EVENT_NAME_LOAD}"),
66            NativeEventName::Unload => write!(formatter, "{EVENT_NAME_UNLOAD}"),
67            NativeEventName::BeforeUnload => write!(formatter, "{EVENT_NAME_BEFOREUNLOAD}"),
68            NativeEventName::Error => write!(formatter, "{EVENT_NAME_ERROR}"),
69            NativeEventName::Online => write!(formatter, "{EVENT_NAME_ONLINE}"),
70            NativeEventName::Offline => write!(formatter, "{EVENT_NAME_OFFLINE}"),
71            NativeEventName::VisibilityChange => write!(formatter, "{EVENT_NAME_VISIBILITYCHANGE}"),
72            NativeEventName::AnimationStart => write!(formatter, "{EVENT_NAME_ANIMATIONSTART}"),
73            NativeEventName::AnimationEnd => write!(formatter, "{EVENT_NAME_ANIMATIONEND}"),
74            NativeEventName::AnimationIteration => {
75                write!(formatter, "{EVENT_NAME_ANIMATIONITERATION}")
76            }
77            NativeEventName::TransitionStart => write!(formatter, "{EVENT_NAME_TRANSITIONSTART}"),
78            NativeEventName::TransitionEnd => write!(formatter, "{EVENT_NAME_TRANSITIONEND}"),
79            NativeEventName::TransitionRun => write!(formatter, "{EVENT_NAME_TRANSITIONRUN}"),
80            NativeEventName::EuvSignalUpdate => write!(formatter, "{EUV_SIGNAL_UPDATE}"),
81            NativeEventName::Other(name) => write!(formatter, "{name}"),
82        }
83    }
84}
85
86/// Implements `FromStr` for `NativeEventName`, enabling parsing from Web-standard
87/// lowercase event name strings (e.g., `"click"`, `"dblclick"`, `"mouseenter"`).
88///
89/// This is the standard library trait for string-to-enum parsing, used by the
90/// `html!` macro to convert event attribute keys (e.g., `onclick`) into the
91/// corresponding `NativeEventName` variant at runtime.
92///
93/// # Supported names
94///
95/// All standard DOM event names in lowercase: `click`, `dblclick`, `mousedown`,
96/// `mouseup`, `mousemove`, `mouseenter`, `mouseleave`, `mouseover`, `mouseout`,
97/// `contextmenu`, `input`, `keydown`, `keyup`, `keypress`, `focus`, `blur`,
98/// `focusin`, `focusout`, `submit`, `change`, `drag`, `dragstart`, `dragend`,
99/// `dragover`, `dragenter`, `dragleave`, `drop`, `touchstart`, `touchend`,
100/// `touchmove`, `touchcancel`, `wheel`, `copy`, `cut`, `paste`, `play`,
101/// `pause`, `ended`, `loadeddata`, `canplay`, `volumechange`, `timeupdate`,
102/// `hashchange`, `popstate`, `resize`, `scroll`, `load`, `unload`,
103/// `beforeunload`, `error`, `online`, `offline`, `visibilitychange`,
104/// `animationstart`, `animationend`, `animationiteration`, `transitionstart`,
105/// `transitionend`, `transitionrun`.
106///
107/// Unknown names fall back to `NativeEventName::Other(name)`.
108impl FromStr for NativeEventName {
109    type Err = ParseNativeEventNameError;
110
111    /// Parses a Web-standard event name string into a `NativeEventName`.
112    ///
113    /// # Arguments
114    ///
115    /// - `&str` - The event name string (e.g., `"click"`, `"mouseenter"`).
116    ///
117    /// # Returns
118    ///
119    /// - `Result<NativeEventName, ParseNativeEventNameError>` - The parsed enum variant,
120    ///   or an error if the input is empty.
121    fn from_str(data: &str) -> Result<Self, Self::Err> {
122        match data {
123            EVENT_NAME_CLICK => Ok(NativeEventName::Click),
124            EVENT_NAME_DBLCLICK => Ok(NativeEventName::DblClick),
125            EVENT_NAME_MOUSEDOWN => Ok(NativeEventName::MouseDown),
126            EVENT_NAME_MOUSEUP => Ok(NativeEventName::MouseUp),
127            EVENT_NAME_MOUSEMOVE => Ok(NativeEventName::MouseMove),
128            EVENT_NAME_MOUSEENTER => Ok(NativeEventName::MouseEnter),
129            EVENT_NAME_MOUSELEAVE => Ok(NativeEventName::MouseLeave),
130            EVENT_NAME_MOUSEOVER => Ok(NativeEventName::MouseOver),
131            EVENT_NAME_MOUSEOUT => Ok(NativeEventName::MouseOut),
132            EVENT_NAME_CONTEXTMENU => Ok(NativeEventName::ContextMenu),
133            EVENT_NAME_INPUT => Ok(NativeEventName::Input),
134            EVENT_NAME_KEYDOWN => Ok(NativeEventName::KeyDown),
135            EVENT_NAME_KEYUP => Ok(NativeEventName::KeyUp),
136            EVENT_NAME_KEYPRESS => Ok(NativeEventName::KeyPress),
137            EVENT_NAME_FOCUS => Ok(NativeEventName::Focus),
138            EVENT_NAME_BLUR => Ok(NativeEventName::Blur),
139            EVENT_NAME_FOCUSIN => Ok(NativeEventName::FocusIn),
140            EVENT_NAME_FOCUSOUT => Ok(NativeEventName::FocusOut),
141            EVENT_NAME_SUBMIT => Ok(NativeEventName::Submit),
142            EVENT_NAME_CHANGE => Ok(NativeEventName::Change),
143            EVENT_NAME_DRAG => Ok(NativeEventName::Drag),
144            EVENT_NAME_DRAGSTART => Ok(NativeEventName::DragStart),
145            EVENT_NAME_DRAGEND => Ok(NativeEventName::DragEnd),
146            EVENT_NAME_DRAGOVER => Ok(NativeEventName::DragOver),
147            EVENT_NAME_DRAGENTER => Ok(NativeEventName::DragEnter),
148            EVENT_NAME_DRAGLEAVE => Ok(NativeEventName::DragLeave),
149            EVENT_NAME_DROP => Ok(NativeEventName::Drop),
150            EVENT_NAME_TOUCHSTART => Ok(NativeEventName::TouchStart),
151            EVENT_NAME_TOUCHEND => Ok(NativeEventName::TouchEnd),
152            EVENT_NAME_TOUCHMOVE => Ok(NativeEventName::TouchMove),
153            EVENT_NAME_TOUCHCANCEL => Ok(NativeEventName::TouchCancel),
154            EVENT_NAME_WHEEL => Ok(NativeEventName::Wheel),
155            EVENT_NAME_COPY => Ok(NativeEventName::Copy),
156            EVENT_NAME_CUT => Ok(NativeEventName::Cut),
157            EVENT_NAME_PASTE => Ok(NativeEventName::Paste),
158            EVENT_NAME_PLAY => Ok(NativeEventName::Play),
159            EVENT_NAME_PAUSE => Ok(NativeEventName::Pause),
160            EVENT_NAME_ENDED => Ok(NativeEventName::Ended),
161            EVENT_NAME_LOADEDDATA => Ok(NativeEventName::LoadedData),
162            EVENT_NAME_CANPLAY => Ok(NativeEventName::CanPlay),
163            EVENT_NAME_VOLUMECHANGE => Ok(NativeEventName::VolumeChange),
164            EVENT_NAME_TIMEUPDATE => Ok(NativeEventName::TimeUpdate),
165            EVENT_NAME_HASHCHANGE => Ok(NativeEventName::HashChange),
166            EVENT_NAME_POPSTATE => Ok(NativeEventName::PopState),
167            EVENT_NAME_RESIZE => Ok(NativeEventName::Resize),
168            EVENT_NAME_SCROLL => Ok(NativeEventName::Scroll),
169            EVENT_NAME_LOAD => Ok(NativeEventName::Load),
170            EVENT_NAME_UNLOAD => Ok(NativeEventName::Unload),
171            EVENT_NAME_BEFOREUNLOAD => Ok(NativeEventName::BeforeUnload),
172            EVENT_NAME_ERROR => Ok(NativeEventName::Error),
173            EVENT_NAME_ONLINE => Ok(NativeEventName::Online),
174            EVENT_NAME_OFFLINE => Ok(NativeEventName::Offline),
175            EVENT_NAME_VISIBILITYCHANGE => Ok(NativeEventName::VisibilityChange),
176            EVENT_NAME_ANIMATIONSTART => Ok(NativeEventName::AnimationStart),
177            EVENT_NAME_ANIMATIONEND => Ok(NativeEventName::AnimationEnd),
178            EVENT_NAME_ANIMATIONITERATION => Ok(NativeEventName::AnimationIteration),
179            EVENT_NAME_TRANSITIONSTART => Ok(NativeEventName::TransitionStart),
180            EVENT_NAME_TRANSITIONEND => Ok(NativeEventName::TransitionEnd),
181            EVENT_NAME_TRANSITIONRUN => Ok(NativeEventName::TransitionRun),
182            "" => Err(ParseNativeEventNameError::new(data.to_string())),
183            other => Ok(NativeEventName::Other(other.to_string())),
184        }
185    }
186}