mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
wip: distribute layout operator parsing
This commit is contained in:
parent
4af6e011b6
commit
fa70a42bad
12 changed files with 150 additions and 81 deletions
|
|
@ -1,15 +1,38 @@
|
|||
use crate::*;
|
||||
|
||||
/// Show one item if a condition is true and another if the condition is false
|
||||
pub struct Either<A, B>(pub bool, pub A, pub B);
|
||||
|
||||
impl<E: Output, A: Render<E>, B: Render<E>> Content<E> for Either<A, B> {
|
||||
pub struct Either<E, A, B>(pub PhantomData<E>, pub bool, pub A, pub B);
|
||||
impl<E, A, B> Either<E, A, B> {
|
||||
pub fn new (c: bool, a: A, b: B) -> Self {
|
||||
Self(Default::default(), c, a, b)
|
||||
}
|
||||
}
|
||||
impl<'a, T, E, A, B> TryFromEdn<'a, T> for Either<E, A, B>
|
||||
where
|
||||
T: EdnProvide<'a, bool> + EdnProvide<'a, B> + EdnProvide<'a, A> + 'a,
|
||||
E: Output,
|
||||
A: Render<E> + 'a,
|
||||
B: Render<E> + 'a,
|
||||
{
|
||||
fn try_from_edn (state: &'a T, head: &EdnItem<&str>, tail: &'a [EdnItem<&str>]) -> Option<Self> {
|
||||
use EdnItem::*;
|
||||
if let (Key("either"), [condition, content, alternative]) = (head, tail) {
|
||||
Some(Self::new(
|
||||
state.get(condition).expect("either: no condition"),
|
||||
state.get(content).expect("either: no content"),
|
||||
state.get(alternative).expect("either: no alternative")
|
||||
))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
impl<E: Output, A: Render<E>, B: Render<E>> Content<E> for Either<E, A, B> {
|
||||
fn layout (&self, to: E::Area) -> E::Area {
|
||||
let Self(cond, a, b) = self;
|
||||
let Self(_, cond, a, b) = self;
|
||||
if *cond { a.layout(to) } else { b.layout(to) }
|
||||
}
|
||||
fn render (&self, to: &mut E) {
|
||||
let Self(cond, a, b) = self;
|
||||
let Self(_, cond, a, b) = self;
|
||||
if *cond { a.render(to) } else { b.render(to) }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue