pub(crate) mod deterministic;
mod encoder;
mod impl_tuples;
mod impls;
use self::write::Writer;
use crate::config::Config;
use crate::error::EncodeError;
use crate::utils::Sealed;
pub mod bit_writer;
pub mod cbor;
pub mod write;
pub use self::encoder::EncoderImpl;
pub trait Encode {
fn encode<E: Encoder>(
&self,
encoder: &mut E,
) -> Result<(), EncodeError>;
}
pub trait Encoder: Sealed + crate::error_path::BincodeErrorPathCovered<1> {
type W: Writer;
type C: Config;
fn writer(&mut self) -> &mut Self::W;
fn config(&self) -> &Self::C;
#[inline(always)]
fn encode_u8(
&mut self,
val: u8,
) -> Result<(), EncodeError> {
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => self.writer().write_u8(val),
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_u8::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_u16(
&mut self,
val: u16,
) -> Result<(), EncodeError> {
use crate::config::Endianness;
use crate::config::Format;
use crate::config::IntEncoding;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => {
match <Self::C as crate::config::InternalIntEncodingConfig>::INT_ENCODING {
| IntEncoding::Variable => {
crate::varint::varint_encode_u16(
self.writer(),
<Self::C as crate::config::InternalEndianConfig>::ENDIAN,
val,
)
},
| IntEncoding::Fixed => {
match <Self::C as crate::config::InternalEndianConfig>::ENDIAN {
| Endianness::Big => self.writer().write_u16(val.to_be()),
| Endianness::Little => self.writer().write_u16(val.to_le()),
}
},
}
},
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_u16::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_u32(
&mut self,
val: u32,
) -> Result<(), EncodeError> {
use crate::config::Endianness;
use crate::config::Format;
use crate::config::IntEncoding;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => {
match <Self::C as crate::config::InternalIntEncodingConfig>::INT_ENCODING {
| IntEncoding::Variable => {
crate::varint::varint_encode_u32(
self.writer(),
<Self::C as crate::config::InternalEndianConfig>::ENDIAN,
val,
)
},
| IntEncoding::Fixed => {
match <Self::C as crate::config::InternalEndianConfig>::ENDIAN {
| Endianness::Big => self.writer().write_u32(val.to_be()),
| Endianness::Little => self.writer().write_u32(val.to_le()),
}
},
}
},
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_u32::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_u64(
&mut self,
val: u64,
) -> Result<(), EncodeError> {
use crate::config::Endianness;
use crate::config::Format;
use crate::config::IntEncoding;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => {
match <Self::C as crate::config::InternalIntEncodingConfig>::INT_ENCODING {
| IntEncoding::Variable => {
crate::varint::varint_encode_u64(
self.writer(),
<Self::C as crate::config::InternalEndianConfig>::ENDIAN,
val,
)
},
| IntEncoding::Fixed => {
match <Self::C as crate::config::InternalEndianConfig>::ENDIAN {
| Endianness::Big => self.writer().write_u64(val.to_be()),
| Endianness::Little => self.writer().write_u64(val.to_le()),
}
},
}
},
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_u64::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_u128(
&mut self,
val: u128,
) -> Result<(), EncodeError> {
use crate::config::Endianness;
use crate::config::Format;
use crate::config::IntEncoding;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => {
match <Self::C as crate::config::InternalIntEncodingConfig>::INT_ENCODING {
| IntEncoding::Variable => {
crate::varint::varint_encode_u128(
self.writer(),
<Self::C as crate::config::InternalEndianConfig>::ENDIAN,
val,
)
},
| IntEncoding::Fixed => {
match <Self::C as crate::config::InternalEndianConfig>::ENDIAN {
| Endianness::Big => self.writer().write_u128(val.to_be()),
| Endianness::Little => self.writer().write_u128(val.to_le()),
}
},
}
},
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_u128::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_usize(
&mut self,
val: usize,
) -> Result<(), EncodeError> {
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => self.encode_u64(val as u64),
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_u64::<_, Self::C>(self.writer(), val as u64)
},
}
}
#[inline(always)]
fn encode_i8(
&mut self,
val: i8,
) -> Result<(), EncodeError> {
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => self.writer().write_u8(val as u8),
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_i8::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_i16(
&mut self,
val: i16,
) -> Result<(), EncodeError> {
use crate::config::Endianness;
use crate::config::Format;
use crate::config::IntEncoding;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => {
match <Self::C as crate::config::InternalIntEncodingConfig>::INT_ENCODING {
| IntEncoding::Variable => {
crate::varint::varint_encode_i16(
self.writer(),
<Self::C as crate::config::InternalEndianConfig>::ENDIAN,
val,
)
},
| IntEncoding::Fixed => {
match <Self::C as crate::config::InternalEndianConfig>::ENDIAN {
| Endianness::Big => self.writer().write_u16(val.to_be() as u16),
| Endianness::Little => self.writer().write_u16(val.to_le() as u16),
}
},
}
},
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_i16::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_i32(
&mut self,
val: i32,
) -> Result<(), EncodeError> {
use crate::config::Endianness;
use crate::config::Format;
use crate::config::IntEncoding;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => {
match <Self::C as crate::config::InternalIntEncodingConfig>::INT_ENCODING {
| IntEncoding::Variable => {
crate::varint::varint_encode_i32(
self.writer(),
<Self::C as crate::config::InternalEndianConfig>::ENDIAN,
val,
)
},
| IntEncoding::Fixed => {
match <Self::C as crate::config::InternalEndianConfig>::ENDIAN {
| Endianness::Big => self.writer().write_u32(val.to_be() as u32),
| Endianness::Little => self.writer().write_u32(val.to_le() as u32),
}
},
}
},
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_i32::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_i64(
&mut self,
val: i64,
) -> Result<(), EncodeError> {
use crate::config::Endianness;
use crate::config::Format;
use crate::config::IntEncoding;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => {
match <Self::C as crate::config::InternalIntEncodingConfig>::INT_ENCODING {
| IntEncoding::Variable => {
crate::varint::varint_encode_i64(
self.writer(),
<Self::C as crate::config::InternalEndianConfig>::ENDIAN,
val,
)
},
| IntEncoding::Fixed => {
match <Self::C as crate::config::InternalEndianConfig>::ENDIAN {
| Endianness::Big => self.writer().write_u64(val.to_be() as u64),
| Endianness::Little => self.writer().write_u64(val.to_le() as u64),
}
},
}
},
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_i64::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_i128(
&mut self,
val: i128,
) -> Result<(), EncodeError> {
use crate::config::Endianness;
use crate::config::Format;
use crate::config::IntEncoding;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => {
match <Self::C as crate::config::InternalIntEncodingConfig>::INT_ENCODING {
| IntEncoding::Variable => {
crate::varint::varint_encode_i128(
self.writer(),
<Self::C as crate::config::InternalEndianConfig>::ENDIAN,
val,
)
},
| IntEncoding::Fixed => {
match <Self::C as crate::config::InternalEndianConfig>::ENDIAN {
| Endianness::Big => self.writer().write_u128(val.to_be() as u128),
| Endianness::Little => self.writer().write_u128(val.to_le() as u128),
}
},
}
},
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_i128::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_isize(
&mut self,
val: isize,
) -> Result<(), EncodeError> {
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => self.encode_i64(val as i64),
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_i64::<_, Self::C>(self.writer(), val as i64)
},
}
}
#[inline(always)]
fn encode_f32(
&mut self,
val: f32,
) -> Result<(), EncodeError> {
use crate::config::Endianness;
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => {
match <Self::C as crate::config::InternalEndianConfig>::ENDIAN {
| Endianness::Big => self.writer().write_u32(val.to_bits().to_be()),
| Endianness::Little => self.writer().write_u32(val.to_bits().to_le()),
}
},
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_f32::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_f64(
&mut self,
val: f64,
) -> Result<(), EncodeError> {
use crate::config::Endianness;
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => {
match <Self::C as crate::config::InternalEndianConfig>::ENDIAN {
| Endianness::Big => self.writer().write_u64(val.to_bits().to_be()),
| Endianness::Little => self.writer().write_u64(val.to_bits().to_le()),
}
},
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_f64::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_bool(
&mut self,
val: bool,
) -> Result<(), EncodeError> {
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => self.encode_u8(u8::from(val)),
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_bool::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_str(
&mut self,
val: &str,
) -> Result<(), EncodeError> {
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => {
self.encode_slice_len(val.len())?;
self.writer().write(val.as_bytes())
},
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_str::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_slice_len(
&mut self,
len: usize,
) -> Result<(), EncodeError> {
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => self.encode_u64(len as u64),
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_slice_len::<_, Self::C>(self.writer(), len)
},
}
}
#[inline(always)]
fn encode_array_len(
&mut self,
len: usize,
) -> Result<(), EncodeError> {
self.encode_slice_len(len)
}
#[inline(always)]
fn encode_map_len(
&mut self,
len: usize,
) -> Result<(), EncodeError> {
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => self.encode_u64(len as u64),
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_map_len::<_, Self::C>(self.writer(), len)
},
}
}
#[inline(always)]
fn encode_byte_slice(
&mut self,
val: &[u8],
) -> Result<(), EncodeError> {
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => {
self.encode_slice_len(val.len())?;
self.writer().write(val)
},
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_byte_slice::<_, Self::C>(self.writer(), val)
},
}
}
#[inline(always)]
fn encode_struct_header(
&mut self,
len: usize,
) -> Result<(), EncodeError> {
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => Ok(()),
| Format::Cbor | Format::CborDeterministic => self.encode_array_len(len),
}
}
#[inline(always)]
fn encode_byte_slice_len(
&mut self,
len: usize,
) -> Result<(), EncodeError> {
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => self.encode_usize(len),
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_byte_slice_len::<_, Self::C>(self.writer(), len as u64)
},
}
}
#[inline(always)]
fn encode_variant_index(
&mut self,
idx: u32,
) -> Result<(), EncodeError> {
use crate::config::Format;
match <Self::C as crate::config::InternalFormatConfig>::FORMAT {
| Format::Bincode | Format::BincodeDeterministic => self.encode_u8(idx as u8),
| Format::Cbor | Format::CborDeterministic => {
cbor::encode_u32::<_, Self::C>(self.writer(), idx)
},
}
}
}
impl<T> crate::error_path::BincodeErrorPathCovered<1> for &mut T where
T: crate::error_path::BincodeErrorPathCovered<1>
{
}
impl<T> Encoder for &mut T
where
T: Encoder,
{
type C = T::C;
type W = T::W;
#[inline(always)]
fn writer(&mut self) -> &mut Self::W {
T::writer(self)
}
#[inline(always)]
fn config(&self) -> &Self::C {
T::config(self)
}
#[inline(always)]
fn encode_u8(
&mut self,
val: u8,
) -> Result<(), EncodeError> {
T::encode_u8(self, val)
}
#[inline(always)]
fn encode_u16(
&mut self,
val: u16,
) -> Result<(), EncodeError> {
T::encode_u16(self, val)
}
#[inline(always)]
fn encode_u32(
&mut self,
val: u32,
) -> Result<(), EncodeError> {
T::encode_u32(self, val)
}
#[inline(always)]
fn encode_u64(
&mut self,
val: u64,
) -> Result<(), EncodeError> {
T::encode_u64(self, val)
}
#[inline(always)]
fn encode_u128(
&mut self,
val: u128,
) -> Result<(), EncodeError> {
T::encode_u128(self, val)
}
#[inline(always)]
fn encode_usize(
&mut self,
val: usize,
) -> Result<(), EncodeError> {
T::encode_usize(self, val)
}
#[inline(always)]
fn encode_i8(
&mut self,
val: i8,
) -> Result<(), EncodeError> {
self.encode_u8(val as u8)
}
#[inline(always)]
fn encode_i16(
&mut self,
val: i16,
) -> Result<(), EncodeError> {
T::encode_i16(self, val)
}
#[inline(always)]
fn encode_i32(
&mut self,
val: i32,
) -> Result<(), EncodeError> {
T::encode_i32(self, val)
}
#[inline(always)]
fn encode_i64(
&mut self,
val: i64,
) -> Result<(), EncodeError> {
T::encode_i64(self, val)
}
#[inline(always)]
fn encode_i128(
&mut self,
val: i128,
) -> Result<(), EncodeError> {
T::encode_i128(self, val)
}
#[inline(always)]
fn encode_isize(
&mut self,
val: isize,
) -> Result<(), EncodeError> {
T::encode_isize(self, val)
}
#[inline(always)]
fn encode_f32(
&mut self,
val: f32,
) -> Result<(), EncodeError> {
T::encode_f32(self, val)
}
#[inline(always)]
fn encode_f64(
&mut self,
val: f64,
) -> Result<(), EncodeError> {
T::encode_f64(self, val)
}
#[inline(always)]
fn encode_bool(
&mut self,
val: bool,
) -> Result<(), EncodeError> {
T::encode_bool(self, val)
}
#[inline(always)]
fn encode_str(
&mut self,
val: &str,
) -> Result<(), EncodeError> {
T::encode_str(self, val)
}
#[inline(always)]
fn encode_slice_len(
&mut self,
len: usize,
) -> Result<(), EncodeError> {
T::encode_slice_len(self, len)
}
#[inline(always)]
fn encode_array_len(
&mut self,
len: usize,
) -> Result<(), EncodeError> {
T::encode_array_len(self, len)
}
#[inline(always)]
fn encode_map_len(
&mut self,
len: usize,
) -> Result<(), EncodeError> {
T::encode_map_len(self, len)
}
#[inline(always)]
fn encode_variant_index(
&mut self,
idx: u32,
) -> Result<(), EncodeError> {
T::encode_variant_index(self, idx)
}
#[inline(always)]
fn encode_byte_slice(
&mut self,
val: &[u8],
) -> Result<(), EncodeError> {
T::encode_byte_slice(self, val)
}
#[inline(always)]
fn encode_struct_header(
&mut self,
len: usize,
) -> Result<(), EncodeError> {
T::encode_struct_header(self, len)
}
}
#[inline(always)]
pub(crate) fn encode_option_variant<E: Encoder, T>(
encoder: &mut E,
value: Option<&T>,
) -> Result<(), EncodeError> {
E::assert_covered();
match value {
| None => 0u8.encode(encoder),
| Some(_) => 1u8.encode(encoder),
}
}
#[inline(always)]
pub(crate) fn encode_slice_len<E: Encoder>(
encoder: &mut E,
len: usize,
) -> Result<(), EncodeError> {
E::assert_covered();
encoder.encode_slice_len(len)
}