#[cfg(feature = "decode")]
use crate::decode::{DecodeError, PbDecoder, PbRead};
#[cfg(feature = "encode")]
use crate::encode::{PbEncoder, PbWrite};
#[cfg(feature = "decode")]
pub trait MessageDecode {
fn decode<R: PbRead>(
&mut self,
decoder: &mut PbDecoder<R>,
len: usize,
) -> Result<(), DecodeError<R::Error>>;
fn decode_from_bytes(
&mut self,
bytes: &[u8],
) -> Result<(), DecodeError<core::convert::Infallible>> {
let mut decoder = PbDecoder::new(bytes);
self.decode(&mut decoder, bytes.len())
}
fn decode_len_delimited<R: PbRead>(
&mut self,
decoder: &mut PbDecoder<R>,
) -> Result<(), DecodeError<R::Error>> {
decoder.decode_len_record(|len, _, decoder| self.decode(decoder, len))
}
}
#[cfg(feature = "decode")]
impl<T: MessageDecode> MessageDecode for &mut T {
fn decode<R: PbRead>(
&mut self,
decoder: &mut PbDecoder<R>,
len: usize,
) -> Result<(), DecodeError<R::Error>> {
(*self).decode(decoder, len)
}
fn decode_from_bytes(
&mut self,
bytes: &[u8],
) -> Result<(), DecodeError<core::convert::Infallible>> {
(*self).decode_from_bytes(bytes)
}
fn decode_len_delimited<R: PbRead>(
&mut self,
decoder: &mut PbDecoder<R>,
) -> Result<(), DecodeError<R::Error>> {
(*self).decode_len_delimited(decoder)
}
}
#[cfg(feature = "encode")]
pub trait MessageEncode {
const MAX_SIZE: Result<usize, &'static str>;
fn encode<W: PbWrite>(&self, encoder: &mut PbEncoder<W>) -> Result<(), W::Error>;
fn encode_len_delimited<W: PbWrite>(&self, encoder: &mut PbEncoder<W>) -> Result<(), W::Error> {
encoder.encode_varint32(self.compute_size() as u32)?;
self.encode(encoder)
}
fn compute_size(&self) -> usize;
}
#[doc(hidden)]
#[cfg(feature = "encode")]
pub trait MessageEncodeCached {
const MAX_SIZE: Result<usize, &'static str>;
type Cache: Default;
fn populate_cache(&self) -> Self::Cache;
fn encode_cached<W: PbWrite>(
&self,
encoder: &mut PbEncoder<W>,
cache: &Self::Cache,
) -> Result<(), W::Error>;
fn compute_size_cached(&self, cache: &Self::Cache) -> usize;
fn encode_len_delimited_cached<W: PbWrite>(
&self,
encoder: &mut PbEncoder<W>,
cache: &Self::Cache,
) -> Result<(), W::Error> {
encoder.encode_varint32(self.compute_size_cached(cache) as u32)?;
self.encode_cached(encoder, cache)
}
}
#[cfg(feature = "encode")]
impl<T: MessageEncodeCached> MessageEncode for T {
const MAX_SIZE: Result<usize, &'static str> = T::MAX_SIZE;
fn encode<W: PbWrite>(&self, encoder: &mut PbEncoder<W>) -> Result<(), W::Error> {
let cache = self.populate_cache();
self.encode_cached(encoder, &cache)
}
fn compute_size(&self) -> usize {
let cache = self.populate_cache();
self.compute_size_cached(&cache)
}
fn encode_len_delimited<W: PbWrite>(&self, encoder: &mut PbEncoder<W>) -> Result<(), W::Error> {
let cache = self.populate_cache();
self.encode_len_delimited_cached(encoder, &cache)
}
}