use crate::*; /// Render to output. pub trait Render: Send + Sync { fn render (&self, context: &mut T) -> Perhaps; } /// Options can be rendered optionally. impl Render for Option where R: Render { fn render (&self, to: &mut T) -> Perhaps { match self { Some(component) => component.render(to), None => Ok(None) } } } /// Boxed references can be rendered. impl<'a, T, U> Render for Box + 'a> { fn render (&self, to: &mut T) -> Perhaps { (**self).render(to) } } /// Immutable references can be rendered. impl Render for &R where R: Render { fn render (&self, to: &mut T) -> Perhaps { (*self).render(to) } } /// Mutable references can be rendered. impl Render for &mut R where R: Render { fn render (&self, to: &mut T) -> Perhaps { (**self).render(to) } } /// Counted references can be rendered. impl Render for Arc where R: Render { fn render (&self, to: &mut T) -> Perhaps { self.as_ref().render(to) } } /// References behind a [Mutex] can be rendered. impl Render for Mutex where R: Render { fn render (&self, to: &mut T) -> Perhaps { self.lock().unwrap().render(to) } } /// References behind a [RwLock] can be rendered. impl Render for RwLock where R: Render { fn render (&self, to: &mut T) -> Perhaps { self.read().unwrap().render(to) } } /// Boxed closures can be rendered. /// /// Rendering unboxed closures should also be possible; /// but in practice implementing the trait for an unboxed /// `Fn` closure causes an impl conflict. impl<'a, T, U> Render for Box Perhaps + Send + Sync + 'a> { fn render (&self, to: &mut T) -> Perhaps { (*self)(to) } }