pink_json/ser/
struct_.rs

1use serde::ser;
2
3use crate::ser::{Error, Result, Serializer};
4
5pub struct SerializeStruct<'a> {
6    ser: &'a mut Serializer,
7    first: bool,
8}
9
10impl<'a> SerializeStruct<'a> {
11    pub(crate) fn new(ser: &'a mut Serializer) -> Self {
12        SerializeStruct { ser, first: true }
13    }
14}
15
16impl<'a> ser::SerializeStruct for SerializeStruct<'a> {
17    type Ok = ();
18    type Error = Error;
19
20    fn serialize_field<T: ?Sized>(&mut self, key: &'static str, value: &T) -> Result<()>
21    where
22        T: ser::Serialize,
23    {
24        // XXX if `value` is `None` we not produce any output for this field
25        if !self.first {
26            self.ser.push(b',')?;
27        }
28        self.first = false;
29
30        self.ser.push(b'"')?;
31        self.ser.extend_from_slice(key.as_bytes())?;
32        self.ser.extend_from_slice(b"\":")?;
33
34        value.serialize(&mut *self.ser)?;
35
36        Ok(())
37    }
38
39    fn end(self) -> Result<Self::Ok> {
40        self.ser.push(b'}')?;
41        Ok(())
42    }
43}
44
45pub struct SerializeStructVariant<'a> {
46    ser: &'a mut Serializer,
47    first: bool,
48}
49
50impl<'a, 'b: 'a> SerializeStructVariant<'a> {
51    pub(crate) fn new(ser: &'a mut Serializer) -> Self {
52        SerializeStructVariant { ser, first: true }
53    }
54}
55
56impl<'a> ser::SerializeStructVariant for SerializeStructVariant<'a> {
57    type Ok = ();
58    type Error = Error;
59
60    fn serialize_field<T: ?Sized>(&mut self, key: &'static str, value: &T) -> Result<()>
61    where
62        T: ser::Serialize,
63    {
64        // XXX if `value` is `None` we not produce any output for this field
65        if !self.first {
66            self.ser.push(b',')?;
67        }
68        self.first = false;
69
70        self.ser.push(b'"')?;
71        self.ser.extend_from_slice(key.as_bytes())?;
72        self.ser.extend_from_slice(b"\":")?;
73
74        value.serialize(&mut *self.ser)?;
75
76        Ok(())
77    }
78
79    fn end(self) -> Result<Self::Ok> {
80        self.ser.extend_from_slice(b"}}")?;
81        Ok(())
82    }
83}