mod message;
pub use message::{MessageBuildError, MessageBuilder};
pub use super::name::NameCompressor;
pub use super::wire::{AsBytes, BuildBytes, TruncationError};
pub trait BuildInMessage {
fn build_in_message(
&self,
contents: &mut [u8],
start: usize,
compressor: &mut NameCompressor,
) -> Result<usize, TruncationError>;
}
impl<T: ?Sized + BuildInMessage> BuildInMessage for &T {
fn build_in_message(
&self,
contents: &mut [u8],
start: usize,
compressor: &mut NameCompressor,
) -> Result<usize, TruncationError> {
T::build_in_message(*self, contents, start, compressor)
}
}
impl BuildInMessage for () {
fn build_in_message(
&self,
_contents: &mut [u8],
start: usize,
_compressor: &mut NameCompressor,
) -> Result<usize, TruncationError> {
Ok(start)
}
}
impl BuildInMessage for u8 {
fn build_in_message(
&self,
contents: &mut [u8],
start: usize,
_compressor: &mut NameCompressor,
) -> Result<usize, TruncationError> {
match contents.get_mut(start..) {
Some(&mut [ref mut b, ..]) => {
*b = *self;
Ok(start + 1)
}
_ => Err(TruncationError),
}
}
}
impl<T: BuildInMessage> BuildInMessage for [T] {
fn build_in_message(
&self,
contents: &mut [u8],
mut start: usize,
compressor: &mut NameCompressor,
) -> Result<usize, TruncationError> {
for item in self {
start = item.build_in_message(contents, start, compressor)?;
}
Ok(start)
}
}
impl<T: BuildInMessage, const N: usize> BuildInMessage for [T; N] {
fn build_in_message(
&self,
contents: &mut [u8],
start: usize,
compressor: &mut NameCompressor,
) -> Result<usize, TruncationError> {
self.as_slice()
.build_in_message(contents, start, compressor)
}
}
#[cfg(feature = "alloc")]
impl<T: ?Sized + BuildInMessage> BuildInMessage for alloc::boxed::Box<T> {
fn build_in_message(
&self,
contents: &mut [u8],
start: usize,
compressor: &mut NameCompressor,
) -> Result<usize, TruncationError> {
T::build_in_message(self, contents, start, compressor)
}
}
#[cfg(feature = "alloc")]
impl<T: ?Sized + BuildInMessage> BuildInMessage for alloc::rc::Rc<T> {
fn build_in_message(
&self,
contents: &mut [u8],
start: usize,
compressor: &mut NameCompressor,
) -> Result<usize, TruncationError> {
T::build_in_message(self, contents, start, compressor)
}
}
#[cfg(feature = "alloc")]
impl<T: ?Sized + BuildInMessage> BuildInMessage for alloc::sync::Arc<T> {
fn build_in_message(
&self,
contents: &mut [u8],
start: usize,
compressor: &mut NameCompressor,
) -> Result<usize, TruncationError> {
T::build_in_message(self, contents, start, compressor)
}
}
#[cfg(feature = "alloc")]
impl<T: BuildInMessage> BuildInMessage for alloc::vec::Vec<T> {
fn build_in_message(
&self,
contents: &mut [u8],
start: usize,
compressor: &mut NameCompressor,
) -> Result<usize, TruncationError> {
self.as_slice()
.build_in_message(contents, start, compressor)
}
}