aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2017-01-03 09:56:08 +0100
committerLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2017-01-03 09:56:08 +0100
commit3e7983d7af8d19393507e50778b818f8dcf24b91 (patch)
treeca7d45b89cf8fd5c9ba581a63a4a6b1b67f06471
parentd82a8fdf39783e3bfae6b2ea9eb08f011ba195b7 (diff)
downloadaskama-3e7983d7af8d19393507e50778b818f8dcf24b91.tar.gz
askama-3e7983d7af8d19393507e50778b818f8dcf24b91.tar.bz2
askama-3e7983d7af8d19393507e50778b818f8dcf24b91.zip
Extend parser to allow different expression types
Diffstat (limited to '')
-rw-r--r--askama_codegen/src/generator.rs12
-rw-r--r--askama_codegen/src/parser.rs12
2 files changed, 18 insertions, 6 deletions
diff --git a/askama_codegen/src/generator.rs b/askama_codegen/src/generator.rs
index 34c9757..b1babce 100644
--- a/askama_codegen/src/generator.rs
+++ b/askama_codegen/src/generator.rs
@@ -1,4 +1,4 @@
-use parser::Node;
+use parser::{Expr, Node};
use std::str;
struct Generator {
@@ -56,18 +56,24 @@ impl Generator {
self.writeln(");");
}
- fn visit_expr(&mut self, s: &[u8]) {
+ fn visit_var(&mut self, s: &[u8]) {
let var_name = str::from_utf8(s).unwrap();
let code = format!("std::fmt::Write::write_fmt(\
&mut buf, format_args!(\"{{}}\", self.{})).unwrap();", var_name);
self.writeln(&code);
}
+ fn visit_expr(&mut self, expr: &Expr) {
+ match expr {
+ &Expr::Var(s) => self.visit_var(s),
+ }
+ }
+
fn handle(&mut self, tokens: &Vec<Node>) {
for n in tokens {
match n {
&Node::Lit(val) => { self.visit_lit(val); },
- &Node::Expr(val) => { self.visit_expr(val); },
+ &Node::Expr(ref val) => { self.visit_expr(&val); },
}
}
}
diff --git a/askama_codegen/src/parser.rs b/askama_codegen/src/parser.rs
index b7a712b..5f3f8c5 100644
--- a/askama_codegen/src/parser.rs
+++ b/askama_codegen/src/parser.rs
@@ -1,8 +1,12 @@
use nom::{self, IResult};
+pub enum Expr<'a> {
+ Var(&'a [u8]),
+}
+
pub enum Node<'a> {
Lit(&'a [u8]),
- Expr(&'a [u8]),
+ Expr(Expr<'a>),
}
fn take_content(i: &[u8]) -> IResult<&[u8], Node> {
@@ -23,9 +27,11 @@ fn take_content(i: &[u8]) -> IResult<&[u8], Node> {
IResult::Done(&i[..0], Node::Lit(&i[..]))
}
-named!(expr_str, delimited!(tag!("{{"), take_until!("}}"), tag!("}}")));
+named!(expr_var<Expr>, map!(ws!(nom::alphanumeric), Expr::Var));
+
+named!(any_expr<Expr>, delimited!(tag!("{{"), expr_var, tag!("}}")));
-named!(expr_node<Node>, map!(expr_str, Node::Expr));
+named!(expr_node<Node>, map!(any_expr, Node::Expr));
named!(parse_template< Vec<Node> >, many1!(alt!(take_content | expr_node)));