anathema_widgets/nodes/
mod.rs

1use anathema_templates::blueprints::Blueprint;
2use anathema_value_resolver::Scope;
3use eval::SlotEval;
4
5pub use self::element::Element;
6use self::eval::{ComponentEval, ControlFlowEval, Evaluator, ForLoopEval, SingleEval};
7pub use self::update::update_widget;
8use crate::error::Result;
9use crate::layout::EvalCtx;
10use crate::widget::WidgetTreeView;
11
12pub(crate) mod component;
13pub(crate) mod controlflow;
14pub(crate) mod element;
15pub(crate) mod eval;
16pub(crate) mod loops;
17mod update;
18
19// -----------------------------------------------------------------------------
20//   - Generators -
21// -----------------------------------------------------------------------------
22pub enum WidgetGenerator<'bp> {
23    Children(&'bp [Blueprint]),
24    Single,
25    Slot(&'bp [Blueprint]),
26    Loop(&'bp [Blueprint]),
27    ControlFlow,
28    Noop,
29}
30
31#[derive(Debug)]
32pub enum WidgetKind<'bp> {
33    Element(Element<'bp>),
34    For(loops::For<'bp>),
35    Iteration(loops::Iteration<'bp>),
36    ControlFlow(controlflow::ControlFlow<'bp>),
37    ControlFlowContainer(u16),
38    Component(component::Component<'bp>),
39    Slot,
40}
41
42#[derive(Debug)]
43pub struct WidgetContainer<'bp> {
44    pub kind: WidgetKind<'bp>,
45    pub(crate) children: &'bp [Blueprint],
46}
47
48impl<'bp> WidgetContainer<'bp> {
49    pub fn new(kind: WidgetKind<'bp>, blueprints: &'bp [Blueprint]) -> Self {
50        Self {
51            kind,
52            children: blueprints,
53        }
54    }
55}
56
57pub fn eval_blueprint<'bp>(
58    blueprint: &'bp Blueprint,
59    ctx: &mut EvalCtx<'_, 'bp>,
60    scope: &Scope<'_, 'bp>,
61    parent: &[u16],
62    tree: &mut WidgetTreeView<'_, 'bp>,
63) -> Result<()> {
64    match blueprint {
65        Blueprint::Single(single) => SingleEval.eval(single, ctx, scope, parent, tree),
66        Blueprint::For(for_loop) => ForLoopEval.eval(for_loop, ctx, scope, parent, tree),
67        Blueprint::ControlFlow(flow) => ControlFlowEval.eval(flow, ctx, scope, parent, tree),
68        Blueprint::Component(component) => ComponentEval.eval(component, ctx, scope, parent, tree),
69        Blueprint::Slot(blueprints) => SlotEval.eval(blueprints, ctx, scope, parent, tree),
70    }
71}