Skip to content

Commit

Permalink
Added testing for reserved variable names
Browse files Browse the repository at this point in the history
Signed-off-by: max <gmx.sht@gmail.com>
  • Loading branch information
PizzasBear authored and djc committed Dec 7, 2023
1 parent b5797cb commit 33eb70c
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 5 deletions.
1 change: 0 additions & 1 deletion askama_parser/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,6 @@ pub(crate) type ParseResult<'a, T = &'a str> = Result<(&'a str, T), nom::Err<Err
///
/// It cannot be used to replace `ParseError` because it expects a generic, which would make
/// `askama`'s users experience less good (since this generic is only needed for `nom`).
#[derive(Debug)]
pub(crate) struct ErrorContext<'a> {
pub(crate) input: &'a str,
pub(crate) message: Option<Cow<'static, str>>,
Expand Down
24 changes: 20 additions & 4 deletions askama_parser/src/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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> {
Expand All @@ -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<Self, nom::Err<ErrorContext<'a>>> {
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)),
}
}
}

Expand Down

0 comments on commit 33eb70c

Please sign in to comment.