anathema_widgets/nodes/
mod.rs1use 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
19pub 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}