Skip to main content

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}