impl RenderOnce on tuples of up to 8 values

This commit is contained in:
Michael Pfaff 2024-03-14 23:01:39 -04:00
parent 2db5b83461
commit 19a740f26c
1 changed files with 64 additions and 4 deletions

View File

@ -131,10 +131,7 @@ pub trait RenderOnce: Sized {
// }
// }
impl<T> RenderOnce for T
where
T: Render,
{
impl<T: Render> RenderOnce for T {
#[inline]
fn render_once(self, b: &mut Buffer) -> Result<(), RenderError> {
self.render(b)
@ -459,6 +456,69 @@ impl<T: Render> Render for Wrapping<T> {
}
}
macro_rules! render_tuple {
($A:ident) => {
render_tuple!(@ $A);
};
($A:ident $(, $T:ident)+) => {
render_tuple!(@ $A $(, $T)+);
render_tuple!($($T),+);
};
(@ $($T:ident),*) => {
impl<$($T: Render),+> Render for ($($T,)+) {
#[inline]
fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
#[allow(non_snake_case)]
let ($($T,)+) = self;
$($T.render(b)?;)+
Ok(())
}
#[inline]
fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
#[allow(non_snake_case)]
let ($($T,)+) = self;
$($T.render_escaped(b)?;)+
Ok(())
}
}
};
}
macro_rules! render_once_tuple {
($A:ident) => {
render_once_tuple!(@ $A);
};
($A:ident $(, $T:ident)+) => {
render_once_tuple!(@ $A $(, $T)+);
render_once_tuple!($($T),+);
};
(@ $($T:ident),*) => {
impl<$($T: RenderOnce),+> RenderOnce for ($($T,)+) {
#[inline]
fn render_once(self, b: &mut Buffer) -> Result<(), RenderError> {
#[allow(non_snake_case)]
let ($($T,)+) = self;
$($T.render_once(b)?;)+
Ok(())
}
#[inline]
fn render_once_escaped(self, b: &mut Buffer) -> Result<(), RenderError> {
#[allow(non_snake_case)]
let ($($T,)+) = self;
$($T.render_once_escaped(b)?;)+
Ok(())
}
}
};
}
// TODO: figure out how to use specialization to allow a Render impl on tuples, if possible. If
// not, oh well, it can be worked around.
// render_tuple!(A, B, C, D, E, F, G, H);
render_once_tuple!(A, B, C, D, E, F, G, H);
/// The error type which is returned from template function
#[derive(Clone, Debug)]
pub enum RenderError {