use std::io::{Read, Write};
mod arrays;
mod primitives;
mod tls_vec;
pub use tls_vec::{
SecretTlsVecU16, SecretTlsVecU32, SecretTlsVecU8, TlsVecU16, TlsVecU32, TlsVecU8,
};
#[cfg(feature = "derive")]
pub use tls_codec_derive::{TlsDeserialize, TlsSerialize};
#[derive(Debug, PartialEq, Clone)]
pub enum Error {
EncodingError,
InvalidVectorLength,
InvalidInput,
DecodingError(String),
EndOfStream,
}
impl From<std::io::Error> for Error {
fn from(e: std::io::Error) -> Self {
match e.kind() {
std::io::ErrorKind::UnexpectedEof => Self::EndOfStream,
_ => Self::DecodingError(format!("io error: {:?}", e)),
}
}
}
pub trait TlsSize {
fn serialized_len(&self) -> usize;
}
pub trait Serialize: TlsSize {
fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<(), Error>;
fn tls_serialize_detached(&self) -> Result<Vec<u8>, Error> {
let mut buffer = Vec::with_capacity(self.serialized_len());
self.tls_serialize(&mut buffer)?;
Ok(buffer)
}
}
pub trait Deserialize {
fn tls_deserialize<R: Read>(bytes: &mut R) -> Result<Self, Error>
where
Self: Sized;
}