impl RenderOnce on tuples of up to 8 values
This commit is contained in:
parent
2db5b83461
commit
19a740f26c
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue