use crate::Context;
use super::{Encode, Encoder};
#[must_use = "Must call end_variant to finish encoding"]
pub trait VariantEncoder: Sized {
type Cx: Context<Error = Self::Error>;
type Error;
type Mode: 'static;
type EncodeTag<'this>: Encoder<Cx = Self::Cx, Error = Self::Error, Mode = Self::Mode>
where
Self: 'this;
type EncodeData<'this>: Encoder<Cx = Self::Cx, Error = Self::Error, Mode = Self::Mode>
where
Self: 'this;
fn cx(&self) -> Self::Cx;
#[must_use = "Encoders must be consumed"]
fn encode_tag(&mut self) -> Result<Self::EncodeTag<'_>, Self::Error>;
#[must_use = "Encoders must be consumed"]
fn encode_data(&mut self) -> Result<Self::EncodeData<'_>, Self::Error>;
fn finish_variant(self) -> Result<(), Self::Error>;
#[inline]
fn insert_variant<T, V>(mut self, tag: T, value: V) -> Result<(), Self::Error>
where
T: Encode<Self::Mode>,
V: Encode<Self::Mode>,
{
self.encode_tag()?.encode(tag)?;
self.encode_data()?.encode(value)?;
self.finish_variant()
}
}