#[cfg(feature = "decode")]
use crate::decode::{DecodeError, PbDecoder, PbRead};
#[cfg(feature = "encode")]
use crate::encode::{PbEncoder, PbWrite};
#[cfg(feature = "decode")]
pub trait FieldDecode {
fn decode_field<R: PbRead>(
&mut self,
tag: crate::Tag,
decoder: &mut PbDecoder<R>,
) -> Result<bool, DecodeError<R::Error>>;
}
#[cfg(feature = "decode")]
impl<T: FieldDecode> FieldDecode for &mut T {
fn decode_field<R: PbRead>(
&mut self,
tag: crate::Tag,
decoder: &mut PbDecoder<R>,
) -> Result<bool, DecodeError<R::Error>> {
(*self).decode_field(tag, decoder)
}
}
#[cfg(feature = "decode")]
impl<T: Default + FieldDecode> FieldDecode for Option<T> {
fn decode_field<R: PbRead>(
&mut self,
tag: crate::Tag,
decoder: &mut PbDecoder<R>,
) -> Result<bool, DecodeError<R::Error>> {
let f = self.get_or_insert_with(Default::default);
f.decode_field(tag, decoder)
}
}
#[cfg(feature = "encode")]
pub trait FieldEncode {
const MAX_SIZE: Result<usize, &str>;
fn encode_fields<W: PbWrite>(&self, encoder: &mut PbEncoder<W>) -> Result<(), W::Error>;
fn compute_fields_size(&self) -> usize;
}
#[cfg(feature = "encode")]
impl<T: FieldEncode> FieldEncode for &T {
const MAX_SIZE: Result<usize, &'static str> = T::MAX_SIZE;
fn encode_fields<W: PbWrite>(&self, encoder: &mut PbEncoder<W>) -> Result<(), W::Error> {
(*self).encode_fields(encoder)
}
fn compute_fields_size(&self) -> usize {
(*self).compute_fields_size()
}
}
#[cfg(feature = "encode")]
impl<T: FieldEncode> FieldEncode for Option<T> {
const MAX_SIZE: Result<usize, &str> = T::MAX_SIZE;
fn encode_fields<W: PbWrite>(&self, encoder: &mut PbEncoder<W>) -> Result<(), W::Error> {
if let Some(f) = self {
f.encode_fields(encoder)?;
}
Ok(())
}
fn compute_fields_size(&self) -> usize {
if let Some(f) = self {
f.compute_fields_size();
}
0
}
}