use crate::buffer::OutputTarget;
use crate::encoder::Encoder;
use crate::Result;
pub trait EncodeInto: Sized {
fn encode_into(self, encoder: &mut Encoder<impl OutputTarget>) -> Result<()>;
}
#[doc(hidden)]
#[macro_export]
macro_rules! implement_encode_into_on_borrowed_type {
($ty:ty) => {
impl EncodeInto for &$ty {
#[doc = concat!("Delegates to [", stringify!($ty), "::encode_into].")]
fn encode_into(self, encoder: &mut Encoder<impl OutputTarget>) -> Result<()> {
(*self).encode_into(encoder)
}
}
};
}
pub use implement_encode_into_on_borrowed_type;
#[doc(hidden)]
#[macro_export]
macro_rules! implement_encode_into_on_numeric_primitive_type {
($ty:ty, $doc_text:literal) => {
impl EncodeInto for $ty {
#[doc = $doc_text]
fn encode_into(self, encoder: &mut Encoder<impl OutputTarget>) -> Result<()> {
let bytes = self.to_le_bytes();
encoder.write_bytes_exact(&bytes)
}
}
implement_encode_into_on_borrowed_type!($ty);
};
}
pub use implement_encode_into_on_numeric_primitive_type;
#[doc(hidden)]
#[macro_export]
macro_rules! impl_encode_into_on_dictionary_type {
($ty:ident, $doc_text:literal) => {
impl<'a, K, V> EncodeInto for &'a $ty<K, V>
where
&'a K: EncodeInto,
&'a V: EncodeInto,
{
#[doc = $doc_text]
fn encode_into(self, encoder: &mut Encoder<impl OutputTarget>) -> Result<()> {
encoder.encode_size(self.len())?;
for (key, value) in self {
encoder.encode(key)?;
encoder.encode(value)?;
}
Ok(())
}
}
};
}
pub use impl_encode_into_on_dictionary_type;