nson/serde_impl/
encode.rs

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}