musli_json/en/
variant_encoder.rs1use musli::en::VariantEncoder;
2use musli::Context;
3use musli_utils::Writer;
4
5use super::{JsonEncoder, JsonObjectKeyEncoder};
6
7pub(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}