use super::error::EncodingResult;
use super::writer::BitWriter;
#[cfg(feature = "base64")]
use data_encoding::BASE64;
pub trait Encodable {
fn encode(&self, writer: &mut BitWriter) -> EncodingResult<()>;
fn encoded_size(&self) -> usize;
fn encode_to_vec(&self) -> EncodingResult<Vec<u8>> {
let mut writer = BitWriter::with_capacity(self.encoded_size());
self.encode(&mut writer)?;
Ok(writer.finish())
}
}
#[cfg(feature = "crc-validation")]
pub trait CrcEncodable: Encodable {
fn encode_with_crc(&self) -> EncodingResult<Vec<u8>>;
}
#[cfg(feature = "base64")]
pub trait Base64Encodable: Encodable {
fn encode_base64(&self) -> EncodingResult<String> {
let bytes = self.encode_to_vec()?;
Ok(BASE64.encode(&bytes))
}
#[cfg(feature = "crc-validation")]
fn encode_base64_with_crc(&self) -> EncodingResult<String>
where
Self: CrcEncodable,
{
let bytes = self.encode_with_crc()?;
Ok(BASE64.encode(&bytes))
}
}