leptos_ws_pro/
messages.rs

1use std::borrow::Cow;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)]
7pub enum Messages {
8    ServerSignal(ServerSignalMessage),
9    // Hier können weitere Nachrichtentypen hinzugefügt werden
10    // ChatMessage(ChatMessage),
11    // StateSync(StateSyncMessage),
12    // etc.
13}
14
15#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)]
16pub enum ServerSignalMessage {
17    Establish(String),
18    EstablishResponse((String, Value)),
19    Update(ServerSignalUpdate),
20}
21
22#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
23pub struct ServerSignalUpdate {
24    pub name: Cow<'static, str>,
25    pub patch: Value, // Simplified: using Value instead of Patch for now
26}
27
28impl ServerSignalUpdate {
29    /// Creates a new [`ServerSignalUpdate`] from an old and new instance of `T`.
30    pub fn new<T>(
31        name: impl Into<Cow<'static, str>>,
32        _old: &T,
33        new: &T,
34    ) -> Result<Self, serde_json::Error>
35    where
36        T: Serialize,
37    {
38        // Simplified: just store the new value for now
39        let new_value = serde_json::to_value(new)?;
40        Ok(ServerSignalUpdate {
41            name: name.into(),
42            patch: new_value,
43        })
44    }
45
46    /// Creates a new [`ServerSignalUpdate`] from two json values.
47    pub fn new_from_json(name: impl Into<Cow<'static, str>>, _old: &Value, new: &Value) -> Self {
48        // Simplified: just store the new value for now
49        ServerSignalUpdate {
50            name: name.into(),
51            patch: new.clone(),
52        }
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use super::*;
59    use serde_json::json;
60
61    #[derive(Serialize, Deserialize, Debug, PartialEq)]
62    struct TestStruct {
63        id: u32,
64        name: String,
65        value: i32,
66    }
67
68    #[test]
69    fn test_server_signal_update_new() {
70        // Arrange
71        let old = TestStruct {
72            id: 1,
73            name: "old".to_string(),
74            value: 10,
75        };
76        let new = TestStruct {
77            id: 1,
78            name: "new".to_string(),
79            value: 20,
80        };
81
82        // Act
83        let update = ServerSignalUpdate::new("test_signal", &old, &new).unwrap();
84
85        // Assert
86        assert_eq!(update.name, "test_signal");
87        assert!(!update.patch.is_null());
88    }
89
90    #[test]
91    fn test_server_signal_update_new_from_json() {
92        // Arrange
93        let old = json!({"id": 1, "name": "old", "value": 10});
94        let new = json!({"id": 1, "name": "new", "value": 20});
95
96        // Act
97        let update = ServerSignalUpdate::new_from_json("test_signal", &old, &new);
98
99        // Assert
100        assert_eq!(update.name, "test_signal");
101        assert!(!update.patch.is_null());
102    }
103
104    #[test]
105    fn test_server_signal_update_no_changes() {
106        // Arrange
107        let data = TestStruct {
108            id: 1,
109            name: "test".to_string(),
110            value: 10,
111        };
112
113        // Act
114        let update = ServerSignalUpdate::new("test_signal", &data, &data).unwrap();
115
116        // Assert
117        assert_eq!(update.name, "test_signal");
118        assert!(update.patch == serde_json::to_value(&data).unwrap());
119    }
120
121    #[test]
122    fn test_server_signal_update_serialization() {
123        // Arrange
124        let old = json!({"value": 10});
125        let new = json!({"value": 20});
126        let update = ServerSignalUpdate::new_from_json("test_signal", &old, &new);
127
128        // Act
129        let serialized = serde_json::to_string(&update).unwrap();
130        let deserialized: ServerSignalUpdate = serde_json::from_str(&serialized).unwrap();
131
132        // Assert
133        assert_eq!(update.name, deserialized.name);
134        assert_eq!(update.patch, deserialized.patch);
135    }
136
137    #[test]
138    fn test_messages_serialization() {
139        // Arrange
140        let establish_msg =
141            Messages::ServerSignal(ServerSignalMessage::Establish("test".to_string()));
142        let old = json!({"value": 10});
143        let new = json!({"value": 20});
144        let update = ServerSignalUpdate::new_from_json("test_signal", &old, &new);
145        let update_msg = Messages::ServerSignal(ServerSignalMessage::Update(update));
146
147        // Act & Assert - Establish message
148        let serialized = serde_json::to_string(&establish_msg).unwrap();
149        let deserialized: Messages = serde_json::from_str(&serialized).unwrap();
150        assert_eq!(establish_msg, deserialized);
151
152        // Act & Assert - Update message
153        let serialized = serde_json::to_string(&update_msg).unwrap();
154        let deserialized: Messages = serde_json::from_str(&serialized).unwrap();
155        assert_eq!(update_msg, deserialized);
156    }
157
158    #[test]
159    fn test_server_signal_message_variants() {
160        // Test Establish variant
161        let establish = ServerSignalMessage::Establish("test_signal".to_string());
162        let serialized = serde_json::to_string(&establish).unwrap();
163        let deserialized: ServerSignalMessage = serde_json::from_str(&serialized).unwrap();
164        assert_eq!(establish, deserialized);
165
166        // Test EstablishResponse variant
167        let response = ServerSignalMessage::EstablishResponse((
168            "test_signal".to_string(),
169            json!({"value": 42}),
170        ));
171        let serialized = serde_json::to_string(&response).unwrap();
172        let deserialized: ServerSignalMessage = serde_json::from_str(&serialized).unwrap();
173        assert_eq!(response, deserialized);
174
175        // Test Update variant
176        let old = json!({"value": 10});
177        let new = json!({"value": 20});
178        let update = ServerSignalUpdate::new_from_json("test_signal", &old, &new);
179        let update_msg = ServerSignalMessage::Update(update);
180        let serialized = serde_json::to_string(&update_msg).unwrap();
181        let deserialized: ServerSignalMessage = serde_json::from_str(&serialized).unwrap();
182        assert_eq!(update_msg, deserialized);
183    }
184}