use crate::{CodecLen, IoRead, IoResult, IoWrite};
#[doc = crate::_tags!(codec)]
#[doc = crate::_doc_location!("data/codec")]
pub trait Decodable<R: IoRead>: Sized {
type Output;
fn decode(reader: &mut R) -> IoResult<Self::Output>;
}
#[doc = crate::_tags!(codec)]
#[doc = crate::_doc_location!("data/codec")]
#[doc = crate::_doc!(vendor: "encode")]
pub trait Encodable<W: IoWrite> {
fn encode(&self, writer: &mut W) -> IoResult<usize>;
}
#[doc = crate::_tags!(codec)]
#[doc = crate::_doc_location!("data/codec")]
#[doc = crate::_doc!(vendor: "encode")]
pub trait EncodableLen: Encodable<CodecLen> {
fn encoded_size(&self) -> IoResult<usize> {
let mut encoder = CodecLen::new();
self.encode(&mut encoder)?;
Ok(encoder.size())
}
}
impl<T: Encodable<CodecLen>> EncodableLen for T {}