musli_json/en/
variant_encoder.rs

1use musli::en::VariantEncoder;
2use musli::Context;
3use musli_utils::Writer;
4
5use super::{JsonEncoder, JsonObjectKeyEncoder};
6
7/// A JSON variant encoder.
8pub(crate) struct JsonVariantEncoder<'a, W, C: ?Sized> {
9    cx: &'a C,
10    writer: W,
11}
12
13impl<'a, W, C> JsonVariantEncoder<'a, W, C>
14where
15    W: Writer,
16    C: ?Sized + Context,
17{
18    #[inline]
19    pub(super) fn new(cx: &'a C, mut writer: W) -> Result<Self, C::Error> {
20        writer.write_byte(cx, b'{')?;
21        Ok(Self { cx, writer })
22    }
23}
24
25impl<'a, W, C> VariantEncoder for JsonVariantEncoder<'a, W, C>
26where
27    W: Writer,
28    C: ?Sized + Context,
29{
30    type Cx = C;
31    type Ok = ();
32    type EncodeTag<'this> = JsonObjectKeyEncoder<'a, W::Mut<'this>, C>
33    where
34        Self: 'this;
35    type EncodeData<'this> = JsonEncoder<'a, W::Mut<'this>, C>
36    where
37        Self: 'this;
38
39    #[inline]
40    fn encode_tag(&mut self) -> Result<Self::EncodeTag<'_>, C::Error> {
41        Ok(JsonObjectKeyEncoder::new(self.cx, self.writer.borrow_mut()))
42    }
43
44    #[inline]
45    fn encode_data(&mut self) -> Result<Self::EncodeData<'_>, C::Error> {
46        self.writer.write_byte(self.cx, b':')?;
47        Ok(JsonEncoder::new(self.cx, self.writer.borrow_mut()))
48    }
49
50    #[inline]
51    fn finish_variant(mut self) -> Result<Self::Ok, C::Error> {
52        self.writer.write_byte(self.cx, b'}')
53    }
54}