From 33eb70c34a3ca6c276ebaf7781a7d44b1a9dad83 Mon Sep 17 00:00:00 2001 From: max Date: Mon, 27 Nov 2023 17:34:04 +0200 Subject: Added testing for reserved variable names Signed-off-by: max --- askama_parser/src/lib.rs | 1 - askama_parser/src/node.rs | 24 ++++++++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) (limited to 'askama_parser/src') diff --git a/askama_parser/src/lib.rs b/askama_parser/src/lib.rs index 4d27d70..9f49f97 100644 --- a/askama_parser/src/lib.rs +++ b/askama_parser/src/lib.rs @@ -135,7 +135,6 @@ pub(crate) type ParseResult<'a, T = &'a str> = Result<(&'a str, T), nom::Err { pub(crate) input: &'a str, pub(crate) message: Option>, diff --git a/askama_parser/src/node.rs b/askama_parser/src/node.rs index d11895b..27d4adc 100644 --- a/askama_parser/src/node.rs +++ b/askama_parser/src/node.rs @@ -224,7 +224,8 @@ impl<'a> Target<'a> { } // neither literal nor struct nor path - map(identifier, Self::Name)(i) + let (new_i, name) = identifier(i)?; + Ok((new_i, Self::verify_name(i, name)?)) } fn lit(i: &'a str) -> ParseResult<'a, Self> { @@ -236,9 +237,24 @@ impl<'a> Target<'a> { ))(i) } - fn named(i: &'a str) -> ParseResult<'a, (&str, Self)> { - let (i, (src, target)) = pair(identifier, opt(preceded(ws(char(':')), Self::parse)))(i)?; - Ok((i, (src, target.unwrap_or(Self::Name(src))))) + fn named(init_i: &'a str) -> ParseResult<'a, (&str, Self)> { + let (i, (src, target)) = + pair(identifier, opt(preceded(ws(char(':')), Self::parse)))(init_i)?; + let target = match target { + Some(target) => target, + None => Self::verify_name(init_i, src)?, + }; + Ok((i, (src, target))) + } + + fn verify_name(input: &'a str, name: &'a str) -> Result>> { + match name { + "self" | "writer" => Err(nom::Err::Failure(ErrorContext { + input, + message: Some(Cow::Owned(format!("Cannot use `{name}` as a name"))), + })), + _ => Ok(Self::Name(name)), + } } } -- cgit