diff --git a/rinja_parser/src/lib.rs b/rinja_parser/src/lib.rs index 4dc3155c..b39d7fab 100644 --- a/rinja_parser/src/lib.rs +++ b/rinja_parser/src/lib.rs @@ -633,7 +633,12 @@ fn path_or_identifier(i: &str) -> ParseResult<'_, PathOrIdentifier<'_>> { path.extend(rest); Ok((i, PathOrIdentifier::Path(path))) } - (None, name, []) if name.chars().next().map_or(true, char::is_lowercase) => { + (None, name, []) + if name + .chars() + .next() + .map_or(true, |c| c == '_' || c.is_lowercase()) => + { Ok((i, PathOrIdentifier::Identifier(name))) } (None, start, tail) => { diff --git a/testing/tests/let.rs b/testing/tests/let.rs index 6f5e6903..0ebb78c8 100644 --- a/testing/tests/let.rs +++ b/testing/tests/let.rs @@ -21,3 +21,13 @@ fn let_macro() { let template = A { y: false }; assert_eq!(template.render().unwrap(), "blob") } + +// Ensures that variables name can start with `_`. +#[test] +fn underscore() { + #[derive(Template)] + #[template(source = r#"{% let _x = 7 %}{{ _x }}"#, ext = "html")] + struct X; + + assert_eq!(X.render().unwrap(), "7") +}