1use crate::envelope::ValueEnvelope;
8use crate::error::{Result, WireError};
9
10pub fn encode(envelope: &ValueEnvelope) -> Vec<u8> {
27 rmp_serde::to_vec_named(envelope).expect("Failed to serialize envelope - this is a bug")
28}
29
30pub fn decode(bytes: &[u8]) -> Result<ValueEnvelope> {
42 rmp_serde::from_slice(bytes).map_err(|e| WireError::DeserializationError(e.to_string()))
43}
44
45pub fn to_json(envelope: &ValueEnvelope) -> serde_json::Value {
58 serde_json::to_value(envelope).expect("Failed to convert to JSON - this is a bug")
59}
60
61pub fn from_json(json: &serde_json::Value) -> Result<ValueEnvelope> {
73 serde_json::from_value(json.clone()).map_err(|e| WireError::DeserializationError(e.to_string()))
74}
75
76pub fn to_json_string(envelope: &ValueEnvelope) -> String {
78 serde_json::to_string(envelope).expect("Failed to serialize to JSON string - this is a bug")
79}
80
81pub fn to_json_string_pretty(envelope: &ValueEnvelope) -> String {
83 serde_json::to_string_pretty(envelope)
84 .expect("Failed to serialize to JSON string - this is a bug")
85}
86
87pub fn from_json_string(s: &str) -> Result<ValueEnvelope> {
89 serde_json::from_str(s).map_err(|e| WireError::DeserializationError(e.to_string()))
90}
91
92pub fn encoded_size(envelope: &ValueEnvelope) -> usize {
96 encode(envelope).len()
97}
98
99pub fn encode_message<T: serde::Serialize>(message: &T) -> Result<Vec<u8>> {
109 rmp_serde::to_vec_named(message)
110 .map_err(|e| WireError::DeserializationError(format!("encode failed: {}", e)))
111}
112
113pub fn decode_message<'a, T: serde::Deserialize<'a>>(bytes: &'a [u8]) -> Result<T> {
118 rmp_serde::from_slice(bytes).map_err(|e| WireError::DeserializationError(e.to_string()))
119}
120
121#[cfg(test)]
122mod tests {
123 use super::*;
124 use crate::value::WireValue;
125
126 #[test]
127 fn test_msgpack_roundtrip() {
128 let env = ValueEnvelope::from_value(WireValue::Number(42.0));
129 let bytes = encode(&env);
130 let decoded = decode(&bytes).unwrap();
131 assert_eq!(env, decoded);
132 }
133
134 #[test]
135 fn test_json_roundtrip() {
136 let env = ValueEnvelope::from_value(WireValue::String("hello world".to_string()));
137 let json = to_json(&env);
138 let decoded = from_json(&json).unwrap();
139 assert_eq!(env, decoded);
140 }
141
142 #[test]
143 fn test_complex_value_roundtrip() {
144 use crate::value::WireTable;
145
146 let table = WireTable {
147 ipc_bytes: vec![1, 2, 3, 4],
148 type_name: Some("TestTable".to_string()),
149 schema_id: Some(1),
150 row_count: 3,
151 column_count: 1,
152 };
153
154 let env = ValueEnvelope::from_value(WireValue::Table(table));
155
156 let bytes = encode(&env);
158 let decoded = decode(&bytes).unwrap();
159 assert_eq!(env, decoded);
160
161 let json = to_json(&env);
163 let decoded = from_json(&json).unwrap();
164 assert_eq!(env, decoded);
165 }
166
167 #[test]
168 fn test_json_string_roundtrip() {
169 let env = ValueEnvelope::timestamp(1704067200000);
170 let json_str = to_json_string(&env);
171 let decoded = from_json_string(&json_str).unwrap();
172 assert_eq!(env, decoded);
173 }
174
175 #[test]
176 fn test_encoded_size() {
177 let small = ValueEnvelope::number(1.0);
178 let large = ValueEnvelope::from_value(WireValue::Array(
179 (0..1000).map(|i| WireValue::Number(i as f64)).collect(),
180 ));
181
182 let small_size = encoded_size(&small);
183 let large_size = encoded_size(&large);
184
185 assert!(small_size < large_size);
187 assert!(small_size < 2000);
190 }
191
192 #[test]
193 fn test_invalid_msgpack() {
194 let result = decode(&[0xFF, 0xFF, 0xFF]);
195 assert!(result.is_err());
196 }
197
198 #[test]
199 fn test_invalid_json() {
200 let json = serde_json::json!({"invalid": "structure"});
201 let result = from_json(&json);
202 assert!(result.is_err());
203 }
204}