aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--askama_shared/src/parser.rs29
-rw-r--r--testing/tests/simple.rs9
2 files changed, 34 insertions, 4 deletions
diff --git a/askama_shared/src/parser.rs b/askama_shared/src/parser.rs
index 7224d02..8210ed0 100644
--- a/askama_shared/src/parser.rs
+++ b/askama_shared/src/parser.rs
@@ -1,7 +1,7 @@
use nom::branch::alt;
use nom::bytes::complete::{escaped, is_not, tag, take_until};
use nom::character::complete::{anychar, char, digit1};
-use nom::combinator::{complete, map, opt};
+use nom::combinator::{complete, map, opt, value};
use nom::error::ParseError;
use nom::multi::{many0, many1, separated_list0, separated_list1};
use nom::sequence::{delimited, pair, tuple};
@@ -312,10 +312,12 @@ fn expr_var_call(i: &[u8]) -> IResult<&[u8], Expr> {
}
fn path(i: &[u8]) -> IResult<&[u8], Vec<&str>> {
+ let root = opt(value("", ws(tag("::"))));
let tail = separated_list1(ws(tag("::")), identifier);
- let (i, (start, _, rest)) = tuple((identifier, ws(tag("::")), tail))(i)?;
-
- let mut path = vec![start];
+ let (i, (root, start, _, rest)) = tuple((root, identifier, ws(tag("::")), tail))(i)?;
+ let mut path = Vec::new();
+ path.extend(root);
+ path.push(start);
path.extend(rest);
Ok((i, path))
}
@@ -1137,6 +1139,25 @@ mod tests {
}
#[test]
+ fn test_parse_root_path() {
+ let syntax = Syntax::default();
+ assert_eq!(
+ super::parse("{{ std::string::String::new() }}", &syntax).unwrap(),
+ vec![Node::Expr(
+ WS(false, false),
+ Expr::PathCall(vec!["std", "string", "String", "new"], vec![]),
+ )],
+ );
+ assert_eq!(
+ super::parse("{{ ::std::string::String::new() }}", &syntax).unwrap(),
+ vec![Node::Expr(
+ WS(false, false),
+ Expr::PathCall(vec!["", "std", "string", "String", "new"], vec![]),
+ )],
+ );
+ }
+
+ #[test]
fn change_delimiters_parse_filter() {
let syntax = Syntax {
expr_start: "{~",
diff --git a/testing/tests/simple.rs b/testing/tests/simple.rs
index 7241005..5ef03b1 100644
--- a/testing/tests/simple.rs
+++ b/testing/tests/simple.rs
@@ -291,6 +291,15 @@ fn test_path_func_call() {
}
#[derive(Template)]
+#[template(source = "{{ ::std::string::ToString::to_string(123) }}", ext = "txt")]
+struct RootPathFunctionTemplate;
+
+#[test]
+fn test_root_path_func_call() {
+ assert_eq!(RootPathFunctionTemplate.render().unwrap(), "123");
+}
+
+#[derive(Template)]
#[template(source = "Hello, {{ Self::world3(self, \"123\", 4) }}!", ext = "txt")]
struct FunctionTemplate;