use crate::*; /// Conditional rendering, in unary and binary forms. pub struct Cond; impl Cond { /// Render `item` when `cond` is true. pub fn when > (cond: bool, item: A) -> When { When(cond, item, Default::default()) } /// Render `item` if `cond` is true, otherwise render `other`. pub fn either , B: Render> (cond: bool, item: A, other: B) -> Either { Either(cond, item, other, Default::default()) } } /// Renders `self.1` when `self.0` is true. pub struct When>(bool, A, PhantomData); /// Renders `self.1` when `self.0` is true, otherwise renders `self.2` pub struct Either, B: Render>(bool, A, B, PhantomData); impl> Render for When { fn min_size (&self, to: E::Size) -> Perhaps { let Self(cond, item, ..) = self; if *cond { item.min_size(to) } else { Ok(Some([0.into(), 0.into()].into())) } } fn render (&self, to: &mut E::Output) -> Usually<()> { let Self(cond, item, ..) = self; if *cond { item.render(to) } else { Ok(()) } } } impl, B: Render> Render for Either { fn min_size (&self, to: E::Size) -> Perhaps { let Self(cond, item, other, ..) = self; if *cond { item.min_size(to) } else { other.min_size(to) } } fn render (&self, to: &mut E::Output) -> Usually<()> { let Self(cond, item, other, ..) = self; if *cond { item.render(to) } else { other.render(to) } } }