1use crate::error::Error;
2use hessian_rs::{ser::Serializer as ValueSerializer, value::Definition};
3
4use serde::{ser, Serialize};
5use std::io;
6
7type Result<T> = std::result::Result<T, Error>;
8
9pub struct Serializer<W: io::Write>(ValueSerializer<W>);
10
11impl<W: io::Write> Serializer<W> {
12 pub fn new(writer: W) -> Self {
13 Serializer(ValueSerializer::new(writer))
14 }
15}
16
17pub struct StructSerializer<'a, W: io::Write> {
18 name: &'static str,
19 ser: &'a mut Serializer<W>,
20 fields: Vec<&'a str>,
21 inx: usize,
22 buf: Vec<u8>,
23}
24
25pub struct MapSerializer<'a, W: io::Write> {
26 name: Option<&'static str>,
27 encoder: &'a mut Serializer<W>,
28}
29
30pub struct ListSerializer<'a, W: io::Write> {
31 ser: &'a mut Serializer<W>,
32 sized: bool,
33}
34
35impl<'a, W> StructSerializer<'a, W>
36where
37 W: io::Write,
38{
39 pub fn new(name: &'static str, ser: &'a mut Serializer<W>) -> Self {
40 StructSerializer {
41 name,
42 ser,
43 fields: Vec::new(),
44 inx: 0,
45 buf: Vec::new(),
46 }
47 }
48}
49
50impl<'a, W: io::Write> ser::SerializeStruct for StructSerializer<'a, W> {
51 type Ok = ();
52 type Error = Error;
53
54 fn serialize_field<U: Serialize + ?Sized>(
55 &mut self,
56 key: &'static str,
57 value: &U,
58 ) -> Result<()> {
59 if let Some(definition) = self.ser.0.get_definition(self.name) {
60 if key != definition.fields[self.inx] {
61 return Err(Error::SyntaxError(hessian_rs::ErrorKind::UnexpectedType(
62 "field name mismatch".to_string(),
63 )));
64 }
65 self.inx += 1;
66 } else {
67 self.fields.push(key);
68 }
69 value.serialize(&mut Serializer::new(&mut self.buf))?;
70 Ok(())
71 }
72
73 #[inline]
74 fn end(self) -> Result<()> {
75 let def = match self.ser.0.get_definition(self.name) {
76 Some(def) => def.clone(),
77 None => {
78 let def = Definition {
79 name: self.name.into(),
80 fields: self.fields.iter().map(|v| v.to_string()).collect(),
81 };
82 self.ser.0.write_definition(&def)?;
83 def
84 }
85 };
86 self.ser.0.write_object_start(&def)?;
87 self.ser.0.extend_from_slice(&self.buf)?;
88 Ok(())
89 }
90}
91
92impl<'a, W: io::Write> ser::SerializeSeq for ListSerializer<'a, W> {
93 type Ok = ();
94 type Error = Error;
95
96 #[inline]
97 fn serialize_element<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
98 value.serialize(&mut *self.ser)?;
99 Ok(())
100 }
101
102 #[inline]
103 fn end(self) -> Result<()> {
104 Ok(())
105 }
106}
107
108impl<'a, W: io::Write> ser::SerializeTuple for ListSerializer<'a, W> {
109 type Ok = ();
110 type Error = Error;
111
112 #[inline]
113 fn serialize_element<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
114 value.serialize(&mut *self.ser)?;
115 Ok(())
116 }
117
118 #[inline]
119 fn end(self) -> Result<()> {
120 if !self.sized {
121 self.ser.0.write_object_end()?;
122 }
123 Ok(())
124 }
125}
126
127impl<'a, W: io::Write> ser::SerializeTupleStruct for ListSerializer<'a, W> {
128 type Ok = ();
129 type Error = Error;
130
131 #[inline]
132 fn serialize_field<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
133 ser::SerializeTuple::serialize_element(self, value)
134 }
135
136 #[inline]
137 fn end(self) -> Result<()> {
138 Ok(())
139 }
140}
141
142impl<'a, W: io::Write> ser::SerializeTupleVariant for ListSerializer<'a, W> {
143 type Ok = ();
144 type Error = Error;
145
146 #[inline]
147 fn serialize_field<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
148 ser::SerializeTuple::serialize_element(self, value)
149 }
150
151 #[inline]
152 fn end(self) -> Result<()> {
153 Ok(())
154 }
155}
156
157impl<'a, W: io::Write> ser::SerializeMap for MapSerializer<'a, W> {
158 type Ok = ();
159 type Error = Error;
160
161 #[inline]
162 fn serialize_key<T: Serialize + ?Sized>(&mut self, key: &T) -> Result<()> {
163 key.serialize(&mut *self.encoder)
164 }
165
166 #[inline]
167 fn serialize_value<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
168 value.serialize(&mut *self.encoder)
169 }
170
171 #[inline]
172 fn serialize_entry<K: ?Sized, V: ?Sized>(
173 &mut self,
174 key: &K,
175 value: &V,
176 ) -> std::result::Result<(), Self::Error>
177 where
178 K: Serialize,
179 V: Serialize,
180 {
181 key.serialize(&mut *self.encoder)?;
182 value.serialize(&mut *self.encoder)
183 }
184
185 #[inline]
186 fn end(self) -> Result<()> {
187 self.encoder.0.write_object_end()?;
188 Ok(())
189 }
190}
191
192impl<'a, W: io::Write> ser::SerializeStruct for MapSerializer<'a, W> {
193 type Ok = ();
194 type Error = Error;
195
196 fn serialize_field<T: Serialize + ?Sized>(
197 &mut self,
198 key: &'static str,
199 value: &T,
200 ) -> Result<()> {
201 ser::SerializeMap::serialize_key(self, key)?;
202 ser::SerializeMap::serialize_value(self, value)
203 }
204
205 #[inline]
206 fn end(self) -> Result<()> {
207 self.encoder.0.write_object_end()?;
208 Ok(())
209 }
210}
211
212impl<'a, W: io::Write> ser::SerializeStructVariant for MapSerializer<'a, W> {
213 type Ok = ();
214 type Error = Error;
215
216 #[inline]
217 fn serialize_field<T: Serialize + ?Sized>(
218 &mut self,
219 key: &'static str,
220 value: &T,
221 ) -> Result<()> {
222 ser::SerializeMap::serialize_key(self, key)?;
223 ser::SerializeMap::serialize_value(self, value)
224 }
225
226 #[inline]
227 fn end(self) -> Result<()> {
228 self.encoder.0.write_object_end()?;
229 Ok(())
230 }
231}
232
233impl<'a, W: io::Write> ser::Serializer for &'a mut Serializer<W> {
234 type Ok = ();
235 type Error = Error;
236
237 type SerializeSeq = ListSerializer<'a, W>;
238 type SerializeTuple = Self::SerializeSeq;
239 type SerializeTupleStruct = Self::SerializeTuple;
240 type SerializeTupleVariant = Self::SerializeTuple;
241 type SerializeMap = MapSerializer<'a, W>;
242 type SerializeStruct = StructSerializer<'a, W>;
243 type SerializeStructVariant = Self::SerializeMap;
244
245 #[inline]
246 fn serialize_bool(self, value: bool) -> Result<()> {
247 self.0.serialize_bool(value)?;
248 Ok(())
249 }
250
251 #[inline]
252 fn serialize_i8(self, value: i8) -> Result<()> {
253 self.0.serialize_int(value as i32)?;
254 Ok(())
255 }
256
257 #[inline]
258 fn serialize_i16(self, value: i16) -> Result<()> {
259 self.0.serialize_int(value as i32)?;
260 Ok(())
261 }
262
263 #[inline]
264 fn serialize_i32(self, value: i32) -> Result<()> {
265 self.0.serialize_int(value)?;
266 Ok(())
267 }
268
269 #[inline]
270 fn serialize_i64(self, value: i64) -> Result<()> {
271 self.0.serialize_long(value)?;
272 Ok(())
273 }
274
275 #[inline]
276 fn serialize_u8(self, value: u8) -> Result<()> {
277 self.0.serialize_int(value as i32)?;
278 Ok(())
279 }
280
281 #[inline]
282 fn serialize_u16(self, value: u16) -> Result<()> {
283 self.0.serialize_int(value as i32)?;
284 Ok(())
285 }
286
287 #[inline]
288 fn serialize_u32(self, value: u32) -> Result<()> {
289 if value < i32::max_value() as u32 {
290 self.0.serialize_int(value as i32)?;
291 } else {
292 self.0.serialize_long(value as i64)?;
293 }
294 Ok(())
295 }
296
297 #[inline]
298 fn serialize_u64(self, value: u64) -> Result<()> {
299 self.0.serialize_long(value as i64)?;
300 Ok(())
301 }
302
303 #[inline]
304 fn serialize_f32(self, value: f32) -> Result<()> {
305 self.0.serialize_double(value as f64)?;
306 Ok(())
307 }
308
309 #[inline]
310 fn serialize_f64(self, value: f64) -> Result<()> {
311 self.0.serialize_double(value)?;
312 Ok(())
313 }
314
315 #[inline]
316 fn serialize_char(self, value: char) -> Result<()> {
317 let mut buf = [0; 4];
318 self.0.serialize_string(value.encode_utf8(&mut buf))?;
319 Ok(())
320 }
321
322 #[inline]
323 fn serialize_str(self, value: &str) -> Result<()> {
324 self.0.serialize_string(value)?;
325 Ok(())
326 }
327
328 #[inline]
329 fn serialize_bytes(self, value: &[u8]) -> Result<()> {
330 self.0.serialize_binary(value)?;
331 Ok(())
332 }
333
334 #[inline]
335 fn serialize_unit(self) -> Result<()> {
336 self.0.serialize_null()?;
337 Ok(())
338 }
339
340 #[inline]
341 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
342 self.0.serialize_null()?;
343 Ok(())
344 }
345
346 #[inline]
347 fn serialize_unit_variant(
348 self,
349 _name: &'static str,
350 _variant_index: u32,
351 variant: &'static str,
352 ) -> Result<()> {
353 self.serialize_str(variant)
354 }
355
356 #[inline]
357 fn serialize_newtype_struct<T: Serialize + ?Sized>(
358 self,
359 _name: &'static str,
360 value: &T,
361 ) -> Result<()> {
362 value.serialize(self)
363 }
364
365 #[inline]
366 fn serialize_newtype_variant<T: Serialize + ?Sized>(
367 self,
368 _name: &'static str,
369 _variant_index: u32,
370 _variant: &'static str,
371 value: &T,
372 ) -> Result<()> {
373 value.serialize(self)
374 }
375
376 #[inline]
377 fn serialize_none(self) -> Result<()> {
378 self.serialize_unit()
379 }
380
381 #[inline]
382 fn serialize_some<T: Serialize + ?Sized>(self, value: &T) -> Result<()> {
383 value.serialize(self)
384 }
385
386 #[inline]
387 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
388 match len {
389 Some(len) => {
390 self.0.write_list_begin(len, None)?;
391 Ok(ListSerializer {
392 ser: self,
393 sized: true,
394 })
395 }
396 None => Ok(ListSerializer {
397 ser: self,
398 sized: false,
399 }),
400 }
401 }
402
403 #[inline]
404 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
405 self.0.write_list_begin(len, None)?;
406 Ok(ListSerializer {
407 ser: self,
408 sized: true,
409 })
410 }
411
412 #[inline]
413 fn serialize_tuple_struct(
414 self,
415 name: &'static str,
416 len: usize,
417 ) -> Result<Self::SerializeTupleStruct> {
418 self.0.write_list_begin(len, Some(name))?;
419 Ok(ListSerializer {
420 ser: self,
421 sized: true,
422 })
423 }
424
425 #[inline]
426 fn serialize_tuple_variant(
427 self,
428 name: &'static str,
429 _variant_index: u32,
430 variant: &'static str,
431 len: usize,
432 ) -> Result<Self::SerializeTupleVariant> {
433 self.0
434 .write_list_begin(len, Some(&format!("{}.{}", name, variant)))?;
435 Ok(ListSerializer {
436 ser: self,
437 sized: true,
438 })
439 }
440
441 #[inline]
442 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
443 self.0.write_map_start(None)?;
444 Ok(MapSerializer {
445 name: None,
446 encoder: self,
447 })
448 }
449
450 #[inline]
451 fn serialize_struct(self, name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
452 Ok(StructSerializer::new(name, self))
453 }
454
455 #[inline]
456 fn serialize_struct_variant(
457 self,
458 name: &'static str,
459 _variant_index: u32,
460 variant: &'static str,
461 _len: usize,
462 ) -> Result<Self::SerializeStructVariant> {
463 self.0.write_map_start(Some(variant))?;
464 Ok(MapSerializer {
465 name: Some(name),
466 encoder: self,
467 })
468 }
469
470 fn serialize_i128(self, v: i128) -> std::result::Result<Self::Ok, Self::Error> {
471 let _ = v;
472 Err(ser::Error::custom("i128 is not supported"))
473 }
474
475 fn serialize_u128(self, v: u128) -> std::result::Result<Self::Ok, Self::Error> {
476 let _ = v;
477 Err(ser::Error::custom("u128 is not supported"))
478 }
479
480 fn collect_str<T: ?Sized>(self, value: &T) -> std::result::Result<Self::Ok, Self::Error>
481 where
482 T: std::fmt::Display,
483 {
484 self.serialize_str(&value.to_string())
485 }
486
487 fn is_human_readable(&self) -> bool {
488 false
489 }
490}
491
492pub fn to_vec<T>(value: &T) -> Result<Vec<u8>>
493where
494 T: Serialize,
495{
496 let mut buf = Vec::new();
497 let mut ser = Serializer::new(&mut buf);
498 value.serialize(&mut ser)?;
499 Ok(buf)
500}
501
502#[cfg(test)]
503mod test {
504 use crate::ser::to_vec;
505 use serde::Serialize;
506
507 #[test]
508 fn test_struct() {
509 {
510 #[derive(Serialize)]
511 #[serde(rename = "example.Car")]
512 struct Car {
513 color: String,
514 model: String,
515 }
516 let output = to_vec(&Car {
517 color: "red".to_string(),
518 model: "Ferrari".to_string(),
519 })
520 .unwrap();
521 assert_eq!(
522 output,
523 &[
524 b'C', 0x0b, b'e', b'x', b'a', b'm', b'p', b'l', b'e', b'.', b'C', b'a', b'r',
525 0x92, 0x05, b'c', b'o', b'l', b'o', b'r', 0x05, b'm', b'o', b'd', b'e', b'l',
526 b'O', 0x90, 0x03, b'r', b'e', b'd', 0x07, b'F', b'e', b'r', b'r', b'a', b'r',
527 b'i',
528 ]
529 );
530 }
531 #[derive(Serialize)]
532 struct Test {
533 int: u32,
534 seq: Vec<&'static str>,
535 }
536
537 let test = Test {
538 int: 1,
539 seq: vec!["a", "b"],
540 };
541 let output = to_vec(&test).unwrap();
542 assert_eq!(
543 output,
544 &[
545 b'C', 0x04, b'T', b'e', b's', b't', 0x92, 0x03, b'i', b'n', b't', 0x03, b's', b'e',
546 b'q', b'O', 0x90, 0x91, 0x7a, 0x01, b'a', 0x01, b'b'
547 ]
548 )
549 }
550
551 #[test]
553 fn test_enum() {
554 #[derive(Serialize)]
555 enum E {
556 Unit,
557 Newtype(u32),
558 Tuple(u32, u32),
559 Struct { a: u32 },
560 }
561
562 let u = E::Unit;
563 let expected = b"\x04Unit";
564 assert_eq!(to_vec(&u).unwrap(), expected);
565
566 let n = E::Newtype(1);
567 assert_eq!(to_vec(&n).unwrap(), &[0x91]);
568
569 let t = E::Tuple(1, 2);
571 assert_eq!(
572 to_vec(&t).unwrap(),
573 &[0x72, 0x07, b'E', b'.', b'T', b'u', b'p', b'l', b'e', 0x91, 0x92]
574 );
575
576 let s = E::Struct { a: 1 };
578 assert_eq!(
579 to_vec(&s).unwrap(),
580 &[b'M', 0x06, b'S', b't', b'r', b'u', b'c', b't', 0x01, b'a', 0x91, b'Z']
581 );
582 }
583}