diff options
Diffstat (limited to 'askama_parser/src')
| -rw-r--r-- | askama_parser/src/lib.rs | 1 | ||||
| -rw-r--r-- | askama_parser/src/node.rs | 24 | 
2 files changed, 20 insertions, 5 deletions
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<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>>, 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<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)), +        }      }  }  | 
