leptos_ws_pro/
messages.rs1use 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 }
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, }
27
28impl ServerSignalUpdate {
29 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 let new_value = serde_json::to_value(new)?;
40 Ok(ServerSignalUpdate {
41 name: name.into(),
42 patch: new_value,
43 })
44 }
45
46 pub fn new_from_json(name: impl Into<Cow<'static, str>>, _old: &Value, new: &Value) -> Self {
48 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 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 let update = ServerSignalUpdate::new("test_signal", &old, &new).unwrap();
84
85 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 let old = json!({"id": 1, "name": "old", "value": 10});
94 let new = json!({"id": 1, "name": "new", "value": 20});
95
96 let update = ServerSignalUpdate::new_from_json("test_signal", &old, &new);
98
99 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 let data = TestStruct {
108 id: 1,
109 name: "test".to_string(),
110 value: 10,
111 };
112
113 let update = ServerSignalUpdate::new("test_signal", &data, &data).unwrap();
115
116 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 let old = json!({"value": 10});
125 let new = json!({"value": 20});
126 let update = ServerSignalUpdate::new_from_json("test_signal", &old, &new);
127
128 let serialized = serde_json::to_string(&update).unwrap();
130 let deserialized: ServerSignalUpdate = serde_json::from_str(&serialized).unwrap();
131
132 assert_eq!(update.name, deserialized.name);
134 assert_eq!(update.patch, deserialized.patch);
135 }
136
137 #[test]
138 fn test_messages_serialization() {
139 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 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 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 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 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 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}