1mod compound;
2mod error;
3
4use compound::Compound;
5use std::io::Write;
6
7use crate::{pack, packer};
8use error::SerError;
9
10impl<'a, W> serde::Serializer for &'a mut packer::Packer<W>
11where
12 W: Write,
13{
14 type Ok = ();
15 type Error = SerError;
16
17 type SerializeSeq = Compound<'a, W>;
18 type SerializeTuple = Compound<'a, W>;
19 type SerializeTupleStruct = Compound<'a, W>;
20 type SerializeTupleVariant = Compound<'a, W>;
21 type SerializeMap = Compound<'a, W>;
22 type SerializeStruct = Compound<'a, W>;
23 type SerializeStructVariant = Compound<'a, W>;
24
25 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
26 pack::pack_bool(&mut self.wr, v).map_err(Self::Error::from)
27 }
28
29 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
30 pack::pack_from_i8(&mut self.wr, v).map_err(Self::Error::from)
31 }
32
33 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
34 pack::pack_from_i16(&mut self.wr, v).map_err(Self::Error::from)
35 }
36
37 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
38 pack::pack_from_i32(&mut self.wr, v).map_err(Self::Error::from)
39 }
40
41 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
42 pack::pack_from_i64(&mut self.wr, v).map_err(Self::Error::from)
43 }
44
45 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
46 pack::pack_from_u8(&mut self.wr, v).map_err(Self::Error::from)
47 }
48
49 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
50 pack::pack_from_u16(&mut self.wr, v).map_err(Self::Error::from)
51 }
52
53 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
54 pack::pack_from_u32(&mut self.wr, v).map_err(Self::Error::from)
55 }
56
57 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
58 pack::pack_from_u64(&mut self.wr, v).map_err(Self::Error::from)
59 }
60
61 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
62 pack::pack_f32(&mut self.wr, v).map_err(Self::Error::from)
63 }
64
65 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
66 pack::pack_f64(&mut self.wr, v).map_err(Self::Error::from)
67 }
68
69 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
70 let mut buf = [0; 4];
71 self.serialize_str(v.encode_utf8(&mut buf))
72 }
73
74 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
75 pack::pack_str(&mut self.wr, v).map_err(Self::Error::from)
76 }
77
78 fn serialize_bytes(self, value: &[u8]) -> Result<Self::Ok, Self::Error> {
79 pack::pack_bin(&mut self.wr, value).map_err(Self::Error::from)
80 }
81
82 fn serialize_none(self) -> Result<(), Self::Error> {
83 self.serialize_unit()
84 }
85
86 fn serialize_some<T: ?Sized + serde::Serialize>(self, v: &T) -> Result<(), Self::Error> {
87 v.serialize(self)
88 }
89
90 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
91 pack::pack_nil(&mut self.wr).map_err(Self::Error::from)
92 }
93
94 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
95 pack::pack_ary_header(&mut self.wr, 0).map_err(Self::Error::from)
96 }
97
98 fn serialize_unit_variant(
99 self,
100 _name: &str,
101 _idx: u32,
102 variant: &str,
103 ) -> Result<Self::Ok, Self::Error> {
104 pack::pack_map_header(&mut self.wr, 1)?;
105 self.serialize_str(variant).map_err(Self::Error::from)?;
106 self.serialize_unit().map_err(Self::Error::from)
107 }
108
109 fn serialize_newtype_struct<T: ?Sized + serde::Serialize>(
110 self,
111 _name: &'static str,
112 value: &T,
113 ) -> Result<(), Self::Error> {
114 value.serialize(self)
115 }
116
117 fn serialize_newtype_variant<T: ?Sized + serde::Serialize>(
118 self,
119 _name: &'static str,
120 _idx: u32,
121 variant: &'static str,
122 value: &T,
123 ) -> Result<Self::Ok, Self::Error> {
124 pack::pack_map_header(&mut self.wr, 1)?;
125 self.serialize_str(variant)?;
127 value.serialize(self)
128 }
129
130 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
131 match len {
132 Some(len) => {
133 pack::pack_ary_header(&mut self.wr, len)?;
134 Ok(self.compound())
135 }
136 None => Err(error::SerError::MustHaveLength),
137 }
138 }
139
140 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
141 self.serialize_seq(Some(len))
142 }
143
144 fn serialize_tuple_struct(
145 self,
146 _name: &'static str,
147 len: usize,
148 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
149 self.serialize_tuple(len)
150 }
151
152 fn serialize_tuple_variant(
153 self,
154 name: &'static str,
155 _idx: u32,
156 variant: &'static str,
157 len: usize,
158 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
159 pack::pack_map_header(&mut self.wr, 1)?;
160 self.serialize_str(variant)?;
162 self.serialize_tuple_struct(name, len)
163 }
164
165 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
166 match len {
167 Some(len) => {
168 pack::pack_map_header(&mut self.wr, len)?;
169 Ok(self.compound())
170 }
171 None => Err(error::SerError::MustHaveLength),
172 }
173 }
174
175 fn serialize_struct(
176 self,
177 _name: &'static str,
178 len: usize,
179 ) -> Result<Self::SerializeStruct, Self::Error> {
180 pack::pack_map_header(&mut self.wr, len)?;
181 Ok(self.compound())
182 }
183
184 fn serialize_struct_variant(
185 self,
186 _name: &'static str,
187 _id: u32,
188 variant: &'static str,
189 len: usize,
190 ) -> Result<Self::SerializeStructVariant, Self::Error> {
191 pack::pack_map_header(&mut self.wr, len)?;
192 self.serialize_str(variant)?;
193 pack::pack_map_header(&mut self.wr, 1)?;
194 Ok(self.compound())
195 }
196}