shelly/event.rs
1use serde::{Deserialize, Serialize};
2use serde_json::{Map, Value};
3
4/// A normalized browser event delivered to a LiveView.
5///
6/// # Examples
7///
8/// ```
9/// use shelly::Event;
10///
11/// let mut event = Event::new("save_profile");
12/// event.target = Some("profile-form".to_string());
13///
14/// assert_eq!(event.name, "save_profile");
15/// assert_eq!(event.target.as_deref(), Some("profile-form"));
16/// ```
17#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
18pub struct Event {
19 /// Logical event name, for example `inc`, `save_profile`, or `validate`.
20 pub name: String,
21
22 /// Optional DOM target id or client-provided target scope.
23 pub target: Option<String>,
24
25 /// Event value. For forms, this is usually an object built from FormData.
26 pub value: Value,
27
28 /// Non-authoritative browser metadata.
29 ///
30 /// Treat this data as untrusted. Use it for diagnostics or UX hints, not
31 /// authorization.
32 #[serde(default)]
33 pub metadata: Map<String, Value>,
34}
35
36impl Event {
37 /// Create a simple event with `null` value and no metadata.
38 pub fn new(name: impl Into<String>) -> Self {
39 Self {
40 name: name.into(),
41 target: None,
42 value: Value::Null,
43 metadata: Map::new(),
44 }
45 }
46}
47
48#[cfg(test)]
49mod tests {
50 use super::Event;
51 use serde_json::Value;
52
53 #[test]
54 fn event_new_defaults_to_null_value() {
55 let event = Event::new("inc");
56 assert_eq!(event.name, "inc");
57 assert_eq!(event.value, Value::Null);
58 assert!(event.target.is_none());
59 assert!(event.metadata.is_empty());
60 }
61}