1use std::io;
2
3use crate::packer::Packer;
4use crate::ser::error::SerError;
5use serde::ser::{self, Serialize};
6
7#[derive(Debug)]
8pub struct Compound<'a, W: 'a> {
9 se: &'a mut Packer<W>,
10}
11
12impl<W: io::Write> Packer<W> {
13 #[inline]
14 pub fn compound(&mut self) -> Compound<W> {
15 Compound { se: self }
16 }
17}
18
19impl<'a, W: io::Write + 'a> ser::SerializeMap for Compound<'a, W> {
20 type Ok = ();
21 type Error = SerError;
22
23 fn serialize_key<T: ?Sized + Serialize>(&mut self, key: &T) -> Result<Self::Ok, Self::Error> {
24 key.serialize(&mut *self.se)
25 }
26
27 fn serialize_value<T: ?Sized + Serialize>(
28 &mut self,
29 value: &T,
30 ) -> Result<Self::Ok, Self::Error> {
31 value.serialize(&mut *self.se)
32 }
33
34 fn end(self) -> Result<Self::Ok, Self::Error> {
35 Ok(())
36 }
37}
38
39impl<'a, W: io::Write + 'a> ser::SerializeSeq for Compound<'a, W> {
40 type Ok = ();
41 type Error = SerError;
42
43 fn serialize_element<T: ?Sized + Serialize>(
44 &mut self,
45 value: &T,
46 ) -> Result<Self::Ok, Self::Error> {
47 value.serialize(&mut *self.se)
48 }
49
50 fn end(self) -> Result<Self::Ok, Self::Error> {
51 Ok(())
52 }
53}
54
55impl<'a, W: io::Write + 'a> ser::SerializeTuple for Compound<'a, W> {
56 type Ok = ();
57 type Error = SerError;
58
59 fn serialize_element<T: ?Sized + Serialize>(
60 &mut self,
61 value: &T,
62 ) -> Result<Self::Ok, Self::Error> {
63 value.serialize(&mut *self.se)
64 }
65
66 fn end(self) -> Result<Self::Ok, Self::Error> {
67 Ok(())
68 }
69}
70
71impl<'a, W: io::Write + 'a> ser::SerializeTupleStruct for Compound<'a, W> {
72 type Ok = ();
73 type Error = SerError;
74
75 fn serialize_field<T: ?Sized + Serialize>(
76 &mut self,
77 value: &T,
78 ) -> Result<Self::Ok, Self::Error> {
79 value.serialize(&mut *self.se)
80 }
81
82 fn end(self) -> Result<Self::Ok, Self::Error> {
83 Ok(())
84 }
85}
86
87impl<'a, W: io::Write + 'a> ser::SerializeTupleVariant for Compound<'a, W> {
88 type Ok = ();
89 type Error = SerError;
90
91 fn serialize_field<T: ?Sized + Serialize>(
92 &mut self,
93 value: &T,
94 ) -> Result<Self::Ok, Self::Error> {
95 value.serialize(&mut *self.se)
96 }
97
98 fn end(self) -> Result<Self::Ok, Self::Error> {
99 Ok(())
100 }
101}
102
103impl<'a, W: io::Write + 'a> ser::SerializeStruct for Compound<'a, W> {
104 type Ok = ();
105 type Error = SerError;
106
107 fn serialize_field<T: ?Sized + Serialize>(
108 &mut self,
109 key: &'static str,
110 value: &T,
111 ) -> Result<Self::Ok, Self::Error> {
112 key.serialize(&mut *self.se)?;
113 value.serialize(&mut *self.se)
114 }
115
116 fn end(self) -> Result<Self::Ok, Self::Error> {
117 Ok(())
118 }
119}
120
121impl<'a, W: io::Write + 'a> ser::SerializeStructVariant for Compound<'a, W> {
122 type Ok = ();
123 type Error = SerError;
124
125 fn serialize_field<T: ?Sized + Serialize>(
126 &mut self,
127 key: &'static str,
128 value: &T,
129 ) -> Result<Self::Ok, Self::Error> {
130 key.serialize(&mut *self.se)?;
131 value.serialize(&mut *self.se)
132 }
133
134 fn end(self) -> Result<Self::Ok, Self::Error> {
135 Ok(())
136 }
137}