1use serde::ser::{Serialize, Serializer, SerializeSeq, SerializeTuple, SerializeTupleStruct,
2 SerializeTupleVariant, SerializeMap, SerializeStruct, SerializeStructVariant};
3
4use crate::message::Message;
5use crate::value::{Value, TimeStamp, Binary};
6use crate::array::Array;
7use crate::message_id::MessageId;
8use crate::encode::to_nson;
9use crate::encode::EncodeError;
10use crate::encode::EncodeResult;
11
12impl Serialize for Message {
13 #[inline]
14 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
15 where S: Serializer
16 {
17 let mut map = serializer.serialize_map(Some(self.len()))?;
18 for (k, v) in self {
19 map.serialize_entry(k, v)?;
20 }
21 map.end()
22 }
23}
24
25impl Serialize for Value {
26 #[inline]
27 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
28 where S: Serializer
29 {
30 match *self {
31 Value::F32(v) => serializer.serialize_f32(v),
32 Value::F64(v) => serializer.serialize_f64(v),
33 Value::I32(v) => serializer.serialize_i32(v),
34 Value::I64(v) => serializer.serialize_i64(v),
35 Value::U32(v) => serializer.serialize_u32(v),
36 Value::U64(v) => serializer.serialize_u64(v),
37 Value::String(ref v) => serializer.serialize_str(v),
38 Value::Array(ref v) => v.serialize(serializer),
39 Value::Message(ref v) => v.serialize(serializer),
40 Value::Bool(v) => serializer.serialize_bool(v),
41 Value::Null => serializer.serialize_unit(),
42 Value::Binary(ref bytes) => serializer.serialize_bytes(&bytes.0),
43 _ => {
44 let msg = self.to_extended_message();
45 msg.serialize(serializer)
46 }
47 }
48 }
49}
50
51#[derive(Default)]
52pub struct Encoder;
53
54impl Encoder {
55 pub fn new() -> Encoder {
56 Encoder
57 }
58}
59
60impl Serializer for Encoder {
61 type Ok = Value;
62 type Error = EncodeError;
63
64 type SerializeSeq = ArraySerializer;
65 type SerializeTuple = TupleSerializer;
66 type SerializeTupleStruct = TupleStructSerializer;
67 type SerializeTupleVariant = TupleVariantSerializer;
68 type SerializeMap = MapSerializer;
69 type SerializeStruct = StructSerializer;
70 type SerializeStructVariant = StructVariantSerializer;
71
72 #[inline]
73 fn serialize_bool(self, value: bool) -> EncodeResult<Value> {
74 Ok(Value::Bool(value))
75 }
76
77 #[inline]
78 fn serialize_i8(self, value: i8) -> EncodeResult<Value> {
79 self.serialize_i32(i32::from(value))
80 }
81
82 #[inline]
83 fn serialize_u8(self, value: u8) -> EncodeResult<Value> {
84 self.serialize_u32(u32::from(value))
85 }
86
87 #[inline]
88 fn serialize_i16(self, value: i16) -> EncodeResult<Value> {
89 self.serialize_i32(i32::from(value))
90 }
91
92 #[inline]
93 fn serialize_u16(self, value: u16) -> EncodeResult<Value> {
94 self.serialize_u32(u32::from(value))
95 }
96
97 #[inline]
98 fn serialize_i32(self, value: i32) -> EncodeResult<Value> {
99 Ok(Value::I32(value))
100 }
101
102 #[inline]
103 fn serialize_u32(self, value: u32) -> EncodeResult<Value> {
104 Ok(Value::U32(value))
105 }
106
107 #[inline]
108 fn serialize_i64(self, value: i64) -> EncodeResult<Value> {
109 Ok(Value::I64(value))
110 }
111
112 #[inline]
113 fn serialize_u64(self, value: u64) -> EncodeResult<Value> {
114 Ok(Value::U64(value))
115 }
116
117 #[inline]
118 fn serialize_f32(self, value: f32) -> EncodeResult<Value> {
119 Ok(Value::F32(value))
120 }
121
122 #[inline]
123 fn serialize_f64(self, value: f64) -> EncodeResult<Value> {
124 Ok(Value::F64(value))
125 }
126
127 #[inline]
128 fn serialize_char(self, value: char) -> EncodeResult<Value> {
129 let mut s = String::new();
130 s.push(value);
131 self.serialize_str(&s)
132 }
133
134 #[inline]
135 fn serialize_str(self, value: &str) -> EncodeResult<Value> {
136 Ok(Value::String(value.to_string()))
137 }
138
139 fn serialize_bytes(self, value: &[u8]) -> EncodeResult<Value> {
140 Ok(Value::Binary(Binary(value.into())))
141 }
142
143 #[inline]
144 fn serialize_none(self) -> EncodeResult<Value> {
145 self.serialize_unit()
146 }
147
148 #[inline]
149 fn serialize_some<V: ?Sized>(self, value: &V) -> EncodeResult<Value>
150 where V: Serialize
151 {
152 value.serialize(self)
153 }
154
155 #[inline]
156 fn serialize_unit(self) -> EncodeResult<Value> {
157 Ok(Value::Null)
158 }
159
160 #[inline]
161 fn serialize_unit_struct(self, _name: &'static str) -> EncodeResult<Value> {
162 self.serialize_unit()
163 }
164
165 #[inline]
166 fn serialize_unit_variant(
167 self,
168 _name: &'static str,
169 _variant_index: u32,
170 variant: &'static str
171 ) -> EncodeResult<Value> {
172 Ok(Value::String(variant.to_string()))
173 }
174
175 #[inline]
176 fn serialize_newtype_struct<T: ?Sized>(
177 self,
178 _name: &'static str,
179 value: &T
180 ) -> EncodeResult<Value>
181 where T: Serialize
182 {
183 value.serialize(self)
184 }
185
186 #[inline]
187 fn serialize_newtype_variant<T: ?Sized>(
188 self,
189 _name: &'static str,
190 _variant_index: u32,
191 variant: &'static str,
192 value: &T
193 ) -> EncodeResult<Value>
194 where T: Serialize
195 {
196 let mut newtype_variant = Message::new();
197 newtype_variant.insert(variant, to_nson(value)?);
198 Ok(Value::Message(newtype_variant))
199 }
200
201 #[inline]
202 fn serialize_seq(self, len: Option<usize>) -> EncodeResult<Self::SerializeSeq> {
203 Ok(ArraySerializer { inner: Array::with_capacity(len.unwrap_or(0)) })
204 }
205
206 #[inline]
207 fn serialize_tuple(self, len: usize) -> EncodeResult<Self::SerializeTuple> {
208 Ok(TupleSerializer { inner: Array::with_capacity(len) })
209 }
210
211 #[inline]
212 fn serialize_tuple_struct(
213 self,
214 _name: &'static str,
215 len: usize
216 ) -> EncodeResult<Self::SerializeTupleStruct> {
217 Ok(TupleStructSerializer { inner: Array::with_capacity(len) })
218 }
219
220 #[inline]
221 fn serialize_tuple_variant(
222 self,
223 _name: &'static str,
224 _variant_index: u32,
225 variant: &'static str,
226 len: usize
227 ) -> EncodeResult<Self::SerializeTupleVariant> {
228 Ok(TupleVariantSerializer {
229 inner: Array::with_capacity(len),
230 name: variant,
231 })
232 }
233
234 #[inline]
235 fn serialize_map(self, _len: Option<usize>) -> EncodeResult<Self::SerializeMap> {
236 Ok(MapSerializer {
237 inner: Message::new(),
238 next_key: None,
239 })
240 }
241
242 #[inline]
243 fn serialize_struct(
244 self,
245 _name: &'static str,
246 _len: usize
247 ) -> EncodeResult<Self::SerializeStruct> {
248 Ok(StructSerializer { inner: Message::new() })
249 }
250
251 #[inline]
252 fn serialize_struct_variant(
253 self,
254 _name: &'static str,
255 _variant_index: u32,
256 variant: &'static str,
257 _len: usize
258 ) -> EncodeResult<Self::SerializeStructVariant> {
259 Ok(StructVariantSerializer {
260 name: variant,
261 inner: Message::new(),
262 })
263 }
264}
265
266
267pub struct ArraySerializer {
268 inner: Array
269}
270
271impl SerializeSeq for ArraySerializer {
272 type Ok = Value;
273 type Error = EncodeError;
274
275 fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> EncodeResult<()> {
276 self.inner.push(to_nson(value)?);
277 Ok(())
278 }
279
280 fn end(self) -> EncodeResult<Value> {
281 Ok(Value::Array(self.inner))
282 }
283}
284
285pub struct TupleSerializer {
286 inner: Array
287}
288
289impl SerializeTuple for TupleSerializer {
290 type Ok = Value;
291 type Error = EncodeError;
292
293 fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> EncodeResult<()> {
294 self.inner.push(to_nson(value)?);
295 Ok(())
296 }
297
298 fn end(self) -> EncodeResult<Value> {
299 Ok(Value::Array(self.inner))
300 }
301}
302
303pub struct TupleStructSerializer {
304 inner: Array
305}
306
307impl SerializeTupleStruct for TupleStructSerializer {
308 type Ok = Value;
309 type Error = EncodeError;
310
311 fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> EncodeResult<()> {
312 self.inner.push(to_nson(value)?);
313 Ok(())
314 }
315
316 fn end(self) -> EncodeResult<Value> {
317 Ok(Value::Array(self.inner))
318 }
319}
320
321pub struct TupleVariantSerializer {
322 inner: Array,
323 name: &'static str
324}
325
326impl SerializeTupleVariant for TupleVariantSerializer {
327 type Ok = Value;
328 type Error = EncodeError;
329
330 fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> EncodeResult<()> {
331 self.inner.push(to_nson(value)?);
332 Ok(())
333 }
334
335 fn end(self) -> EncodeResult<Value> {
336 let mut tuple_variant = Message::new();
337 tuple_variant.insert(self.name, self.inner);
338 Ok(Value::Message(tuple_variant))
339 }
340}
341
342pub struct MapSerializer {
343 inner: Message,
344 next_key: Option<String>
345}
346
347impl SerializeMap for MapSerializer {
348 type Ok = Value;
349 type Error = EncodeError;
350
351 fn serialize_key<T: ?Sized + Serialize>(&mut self, key: &T) -> EncodeResult<()> {
352 self.next_key = match to_nson(&key)? {
353 Value::String(s) => Some(s),
354 other => return Err(EncodeError::InvalidMapKeyType(other)),
355 };
356 Ok(())
357 }
358
359 fn serialize_value<T: ?Sized + Serialize>(&mut self, value: &T) -> EncodeResult<()> {
360 let key = self.next_key.take().unwrap_or_else(|| "".to_string());
361 self.inner.insert(key, to_nson(&value)?);
362 Ok(())
363 }
364
365 fn end(self) -> EncodeResult<Value> {
366 Ok(Value::from_extended_message(self.inner))
367 }
368}
369
370pub struct StructSerializer {
371 inner: Message
372}
373
374impl SerializeStruct for StructSerializer {
375 type Ok = Value;
376 type Error = EncodeError;
377
378 fn serialize_field<T: ?Sized + Serialize>(
379 &mut self,
380 key: &'static str,
381 value: &T
382 ) -> EncodeResult<()> {
383 self.inner.insert(key, to_nson(value)?);
384 Ok(())
385 }
386
387 fn end(self) -> EncodeResult<Value> {
388 Ok(Value::from_extended_message(self.inner))
389 }
390}
391
392pub struct StructVariantSerializer {
393 inner: Message,
394 name: &'static str
395}
396
397impl SerializeStructVariant for StructVariantSerializer {
398 type Ok = Value;
399 type Error = EncodeError;
400
401 fn serialize_field<T: ?Sized + Serialize>(
402 &mut self,
403 key: &'static str,
404 value: &T
405 ) -> EncodeResult<()> {
406 self.inner.insert(key, to_nson(value)?);
407 Ok(())
408 }
409
410 fn end(self) -> EncodeResult<Value> {
411 let var = Value::from_extended_message(self.inner);
412
413 let mut struct_variant = Message::new();
414 struct_variant.insert(self.name, var);
415
416 Ok(Value::Message(struct_variant))
417 }
418}
419
420impl Serialize for TimeStamp {
421 #[inline]
422 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
423 where S: Serializer
424 {
425 let value = Value::TimeStamp(*self);
426 value.serialize(serializer)
427 }
428}
429
430impl Serialize for MessageId {
431 #[inline]
432 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
433 where S: Serializer
434 {
435 let value = Value::MessageId(*self);
436 value.serialize(serializer)
437 }
438}
439
440impl Serialize for Binary {
441 #[inline]
442 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
443 where
444 S: Serializer,
445 {
446 let value = Value::Binary(self.clone());
447 value.serialize(serializer)
448 }
449}