diff --git a/src/format.rs b/src/format.rs index a2f1ffb..3285e06 100644 --- a/src/format.rs +++ b/src/format.rs @@ -85,7 +85,7 @@ pub trait Display { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result; } -pub fn format(value: &T) -> Formatted { +pub fn format<'a, T>(value: &'a T) -> Formatted<'a, T> { Formatted(value) } diff --git a/src/lib.rs b/src/lib.rs index 4cb0d7f..5000e46 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1283,6 +1283,15 @@ mod tests { } #[rstest] + #[case( + "def definition() { \"foo\": \"bar\" } definition()", + "{ \"foo\": \"bar\" }" + )] + #[case( + "def letter() let message = \"foo\" { \"text\": $message } letter()", + "{ \"text\": \"foo\" }" + )] + #[case("def nuller() null nuller()", "null")] #[case("def my_add(a, b)\n $a + $b \n my_add(1, 2)", "3")] #[case("def my_add(a, b)\n let foo = $a \n $foo + $b \n my_add(1, 2)", "3")] #[case( diff --git a/src/parser/jslt.pest b/src/parser/jslt.pest index 6dc5afc..d79fb94 100644 --- a/src/parser/jslt.pest +++ b/src/parser/jslt.pest @@ -1,6 +1,6 @@ Jslt = _{ SOI ~ Expr ~ EOI } -Value = _{ Array | Object | Number | String | Boolean | Null | FunctionCall | Accessor | Scope | Variable } +Value = _{ FunctionCall | Accessor | Scope | Variable | Array | Object | Number | String | Boolean | Null } Expr = _{ OperatorExpr | ValueExpr } ValueExpr = _{ VariableDef | FunctionDef | IfStatement | Value } @@ -22,8 +22,8 @@ And = { "and" } Or = { "or" } If = _{ "if" } For = _{ "for" } -Def = _{ "def" } -Let = _{ "let" } +Def = _{ "def " } +Let = _{ "let " } Scope = { "(" ~ Expr ~ ")" } @@ -35,8 +35,8 @@ FromRangeAccessor = { Expr ~ ":" ~ Expr? } ToRangeAccessor = { Expr? ~ ":" ~ Expr } RangeAccessor = { FromRangeAccessor | ToRangeAccessor } -FunctionCall = { Ident ~ FunctionCallArgs ~ Accessor? } -FunctionCallArgs = { "(" ~ Expr? ~ ("," ~ Expr)* ~ ")" } +FunctionCall = ${ Ident ~ FunctionCallArgs ~ Accessor? } +FunctionCallArgs = !{ "(" ~ Expr? ~ ("," ~ Expr)* ~ ")" } FunctionDef = { Def ~ Ident ~ "(" ~ Ident? ~ ("," ~ Ident)* ~ ")" ~ Expr ~ Expr? }