From 2a3d0f4b390457174ed09347dd29e97ff9a783e4 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Wed, 15 Dec 2021 20:27:41 +0100 Subject: Set Rules Episode VII: The Set Awakens --- src/eval/mod.rs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'src/eval/mod.rs') diff --git a/src/eval/mod.rs b/src/eval/mod.rs index 6dcff900..ae330134 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -9,6 +9,7 @@ mod value; #[macro_use] mod styles; mod capture; +mod class; mod function; mod node; mod ops; @@ -16,6 +17,7 @@ mod scope; pub use array::*; pub use capture::*; +pub use class::*; pub use dict::*; pub use function::*; pub use node::*; @@ -54,7 +56,7 @@ pub fn eval(ctx: &mut Context, source: SourceId, markup: &Markup) -> TypResult v.eval(ctx), Self::Binary(v) => v.eval(ctx), Self::Let(v) => v.eval(ctx), + Self::Set(v) => v.eval(ctx), Self::If(v) => v.eval(ctx), Self::While(v) => v.eval(ctx), Self::For(v) => v.eval(ctx), @@ -474,9 +477,17 @@ impl Eval for CallExpr { Ok(value) } + Value::Class(class) => { + let mut styles = Styles::new(); + class.set(&mut styles, &mut args)?; + let node = class.construct(ctx, &mut args)?; + args.finish()?; + Ok(Value::Node(node.styled(styles))) + } + v => bail!( self.callee().span(), - "expected function or collection, found {}", + "expected callable or collection, found {}", v.type_name(), ), } @@ -643,6 +654,19 @@ impl Eval for LetExpr { } } +impl Eval for SetExpr { + type Output = Value; + + fn eval(&self, ctx: &mut EvalContext) -> TypResult { + let class = self.class(); + let class = class.eval(ctx)?.cast::().at(class.span())?; + let mut args = self.args().eval(ctx)?; + class.set(&mut ctx.styles, &mut args)?; + args.finish()?; + Ok(Value::None) + } +} + impl Eval for IfExpr { type Output = Value; -- cgit v1.2.3