mirror of
https://codeberg.org/unspeaker/tengri.git
synced 2026-09-18 05:16:44 +02:00
61 lines
1.9 KiB
Rust
61 lines
1.9 KiB
Rust
use crate::*;
|
|
|
|
pub struct When<T>(pub bool, pub T);
|
|
|
|
impl<S: Screen, T: Draw<S>> Draw<S> for When<T> {
|
|
fn draw (&self, to: &mut S) -> Drawn<S::Unit> {
|
|
#[cfg(feature = "prof")] profiling::scope!("when");
|
|
if self.0 {
|
|
self.1.draw(to)
|
|
} else {
|
|
Ok(Default::default())
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<T> When<T> {
|
|
|
|
fn_kw_layout!(interpret |state, output, expr| {
|
|
#[cfg(feature = "prof")] profiling::scope!("kw_when");
|
|
let thunk = draw(move|screen|ok_flat(expr.nth(2)?.map(|x|state.interpret(screen, x))));
|
|
ok_flat(matches!(expr.head()?, Some("when")).then(||{
|
|
when(state.namespace(&expr.nth(1)?)?.unwrap(), thunk).draw(output)
|
|
}))
|
|
});
|
|
}
|
|
|
|
/// Only render when condition is true.
|
|
///
|
|
/// ```
|
|
/// # use ::tengri::*; fn test <'a> () -> impl Draw<Tui> {
|
|
/// when(true, "Yes")
|
|
/// # }
|
|
/// ```
|
|
pub const fn when <'a, T: Screen> (condition: bool, item: impl Draw<T>) -> impl Draw<T> {
|
|
When(condition, item)
|
|
}
|
|
|
|
fn_kw_layout!(kw_either |state, output, expr| {
|
|
#[cfg(feature = "prof")] profiling::scope!("kw_layout");
|
|
let thunk_a = draw(move|screen|ok_flat(expr.nth(2)?.map(|x|state.interpret(screen, x))));
|
|
let thunk_b = draw(move|screen|ok_flat(expr.nth(3)?.map(|x|state.interpret(screen, x))));
|
|
ok_flat(matches!(expr.head()?, Some("either")).then(||{
|
|
either(state.namespace(&expr.nth(1)?)?.unwrap(), thunk_a, thunk_b).draw(output)
|
|
}))
|
|
});
|
|
|
|
/// Render one thing if a condition is true and another false.
|
|
///
|
|
/// ```
|
|
/// # use ::tengri::*; fn test <'a> () -> impl Draw<Tui> {
|
|
/// either(true, "Yes", "No")
|
|
/// # }
|
|
/// ```
|
|
pub const fn either <'a, T: Screen> (
|
|
condition: bool, a: impl Draw<T>, b: impl Draw<T>
|
|
) -> impl Draw<T> {
|
|
draw(move|to: &mut T|{
|
|
#[cfg(feature = "prof")] profiling::scope!("either");
|
|
if condition { a.draw(to) } else { b.draw(to) }
|
|
})
|
|
}
|