From 7d124e616e6891017fbe6b31e1f49c959b2c88e2 Mon Sep 17 00:00:00 2001 From: Chris Wong <lambda.fairy@gmail.com> Date: Wed, 23 Sep 2015 14:29:45 +1200 Subject: [PATCH] Add `#call` instruction --- maud_macros/src/parse.rs | 6 ++++++ maud_macros/src/render.rs | 7 +++++++ maud_macros/tests/tests.rs | 22 ++++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/maud_macros/src/parse.rs b/maud_macros/src/parse.rs index 0825f3d..68f6003 100644 --- a/maud_macros/src/parse.rs +++ b/maud_macros/src/parse.rs @@ -152,6 +152,12 @@ impl<'cx, 'i> Parser<'cx, 'i> { self.shift(2); try!(self.for_expr(sp)); }, + // Call + [pound!(), ident!(sp, name), ..] if name.name == "call" => { + self.shift(2); + let func = try!(self.splice(sp)); + self.render.emit_call(func); + }, // Splice [ref tt @ dollar!(), dollar!(), ..] => { self.shift(2); diff --git a/maud_macros/src/render.rs b/maud_macros/src/render.rs index a4f0f11..36add0e 100644 --- a/maud_macros/src/render.rs +++ b/maud_macros/src/render.rs @@ -190,6 +190,13 @@ impl<'cx> Renderer<'cx> { let stmt = quote_stmt!(self.cx, for $pattern in $iterable { $body }).unwrap(); self.push(stmt); } + + pub fn emit_call(&mut self, func: P<Expr>) { + let w = self.writer; + let expr = quote_expr!(self.cx, ($func)(&mut *$w)); + let stmt = self.wrap_try(expr); + self.push(stmt); + } } fn html_escape(s: &str) -> String { diff --git a/maud_macros/tests/tests.rs b/maud_macros/tests/tests.rs index 3950b5f..cbbb8d6 100644 --- a/maud_macros/tests/tests.rs +++ b/maud_macros/tests/tests.rs @@ -3,6 +3,8 @@ extern crate maud; +use std::fmt; + #[test] fn literals() { let mut s = String::new(); @@ -271,3 +273,23 @@ mod issue_10 { assert_eq!(s, r#"<this sentence-is="false" of-course></this>"#); } } + +#[test] +fn call() { + fn ducks(w: &mut fmt::Write) -> fmt::Result { + write!(w, "Ducks") + } + let mut s = String::new(); + let swans = |yes| + if yes { + |w: &mut fmt::Write| write!(w, "Swans") + } else { + panic!("oh noes") + }; + html!(s, { + #call ducks + #call (|w: &mut fmt::Write| write!(w, "Geese")) + #call swans(true) + }).unwrap(); + assert_eq!(s, "DucksGeeseSwans"); +}