--- a/crates/jrsonnet-evaluator/src/evaluate/mod.rs +++ b/crates/jrsonnet-evaluator/src/evaluate/mod.rs @@ -454,19 +454,18 @@ } pub fn evaluate_assert(ctx: Context, assertion: &AssertStmt) -> Result<()> { - let value = &assertion.0; - let msg = &assertion.1; + let AssertStmt { assertion, message } = assertion; let assertion_result = in_frame( - CallLocation::new(&value.span), + CallLocation::new(&assertion.span), || "assertion condition".to_owned(), - || bool::from_untyped(evaluate(ctx.clone(), value)?), + || bool::from_untyped(evaluate(ctx.clone(), assertion)?), )?; if !assertion_result { in_frame( - CallLocation::new(&value.span), + CallLocation::new(&assertion.span), || "assertion failure".to_owned(), || { - if let Some(msg) = msg { + if let Some(msg) = message { bail!(AssertionFailed(evaluate(ctx, msg)?.to_string()?)); } bail!(AssertionFailed(Val::Null.to_string()?)); --- a/crates/jrsonnet-ir-parser/src/lib.rs +++ b/crates/jrsonnet-ir-parser/src/lib.rs @@ -237,13 +237,13 @@ fn assert_stmt(p: &mut Parser<'_>) -> Result { p.eat(T![assert])?; - let cond = spanned(p, expr)?; - let msg = if p.try_eat(T![:]) { - Some(spanned(p, expr)?) + let assertion = spanned(p, expr)?; + let message = if p.try_eat(T![:]) { + Some(expr(p)?) } else { None }; - Ok(AssertStmt(cond, msg)) + Ok(AssertStmt { assertion, message }) } fn if_spec_data(p: &mut Parser<'_>) -> Result { --- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_test.snap +++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_test.snap @@ -4,8 +4,8 @@ --- AssertExpr( AssertExpr { - assert: AssertStmt( - Index { + assert: AssertStmt { + assertion: Index { indexable: Literal( True, ), @@ -18,12 +18,12 @@ }, ], } from virtual::7-18, - Some( + message: Some( Literal( False, - ) from virtual::21-26, + ), ), - ), + }, rest: Literal( True, ), --- a/crates/jrsonnet-ir/src/expr.rs +++ b/crates/jrsonnet-ir/src/expr.rs @@ -38,7 +38,10 @@ } #[derive(Debug, PartialEq, Acyclic)] -pub struct AssertStmt(pub Spanned, pub Option>); +pub struct AssertStmt { + pub assertion: Spanned, + pub message: Option, +} #[derive(Debug, PartialEq, Acyclic)] pub struct FieldMember { --- a/crates/jrsonnet-ir/src/visit.rs +++ b/crates/jrsonnet-ir/src/visit.rs @@ -157,10 +157,10 @@ } pub fn visit_assert_stmt(v: &mut V, ass: &AssertStmt) { - let AssertStmt(cond, msg) = ass; - v.visit_expr(cond); - if let Some(msg) = msg { - v.visit_expr(msg); + let AssertStmt { assertion, message } = ass; + v.visit_expr(assertion); + if let Some(message) = message { + v.visit_expr(message); } } pub fn visit_expr(v: &mut V, e: &Expr) { --- a/crates/jrsonnet-peg-parser/src/lib.rs +++ b/crates/jrsonnet-peg-parser/src/lib.rs @@ -138,7 +138,7 @@ / name:id() _ "(" _ params:params(s) _ ")" _ "=" _ value:expr(s) {BindSpec::Function{name, params, value: Rc::new(value)}} pub rule assertion(s: &ParserSettings) -> AssertStmt - = keyword("assert") _ cond:spanned(, s) msg:(_ ":" _ e:spanned(, s) {e})? { AssertStmt(cond, msg) } + = keyword("assert") _ assertion:spanned(, s) message:(_ ":" _ e:expr(s) {e})? { AssertStmt{assertion, message} } pub rule whole_line() -> &'input str = str:$((!['\n'][_])* "\n") {str}