difftreelog
refactor Option<&ExprLocation> -> &Option<_>
in: master
6 files changed
crates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth222223fn std_format(str: IStr, vals: Val) -> Result<Val> {23fn std_format(str: IStr, vals: Val) -> Result<Val> {24 push(24 push(25 &Some(ExprLocation(Rc::from(PathBuf::from("std.jsonnet")), 0, 0)),25 Some(&ExprLocation(Rc::from(PathBuf::from("std.jsonnet")), 0, 0)),26 || format!("std.format of {}", str),26 || format!("std.format of {}", str),27 || {27 || {28 Ok(match vals {28 Ok(match vals {34 )34 )35}35}363637type Builtin = fn(context: Context, loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val>;37type Builtin = fn(context: Context, loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val>;383839type BuiltinsType = HashMap<Box<str>, Builtin>;39type BuiltinsType = HashMap<Box<str>, Builtin>;404078 };78 };79}79}808081fn builtin_length(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {81fn builtin_length(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {82 parse_args!(context, "length", args, 1, [82 parse_args!(context, "length", args, 1, [83 0, x: ty!((string | object | array));83 0, x: ty!((string | object | array));84 ], {84 ], {96 })96 })97}97}989899fn builtin_type(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {99fn builtin_type(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {100 parse_args!(context, "type", args, 1, [100 parse_args!(context, "type", args, 1, [101 0, x: ty!(any);101 0, x: ty!(any);102 ], {102 ], {106106107fn builtin_make_array(107fn builtin_make_array(108 context: Context,108 context: Context,109 _loc: &Option<ExprLocation>,109 _loc: Option<&ExprLocation>,110 args: &ArgsDesc,110 args: &ArgsDesc,111) -> Result<Val> {111) -> Result<Val> {112 parse_args!(context, "makeArray", args, 2, [112 parse_args!(context, "makeArray", args, 2, [126126127fn builtin_codepoint(127fn builtin_codepoint(128 context: Context,128 context: Context,129 _loc: &Option<ExprLocation>,129 _loc: Option<&ExprLocation>,130 args: &ArgsDesc,130 args: &ArgsDesc,131) -> Result<Val> {131) -> Result<Val> {132 parse_args!(context, "codepoint", args, 1, [132 parse_args!(context, "codepoint", args, 1, [138138139fn builtin_object_fields_ex(139fn builtin_object_fields_ex(140 context: Context,140 context: Context,141 _loc: &Option<ExprLocation>,141 _loc: Option<&ExprLocation>,142 args: &ArgsDesc,142 args: &ArgsDesc,143) -> Result<Val> {143) -> Result<Val> {144 parse_args!(context, "objectFieldsEx", args, 2, [144 parse_args!(context, "objectFieldsEx", args, 2, [157157158fn builtin_object_has_ex(158fn builtin_object_has_ex(159 context: Context,159 context: Context,160 _loc: &Option<ExprLocation>,160 _loc: Option<&ExprLocation>,161 args: &ArgsDesc,161 args: &ArgsDesc,162) -> Result<Val> {162) -> Result<Val> {163 parse_args!(context, "objectHasEx", args, 3, [163 parse_args!(context, "objectHasEx", args, 3, [175}175}176176177// faster177// faster178fn builtin_slice(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {178fn builtin_slice(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {179 parse_args!(context, "slice", args, 4, [179 parse_args!(context, "slice", args, 4, [180 0, indexable: ty!((string | array));180 0, indexable: ty!((string | array));181 1, index: ty!((number | null));181 1, index: ty!((number | null));216// faster216// faster217fn builtin_primitive_equals(217fn builtin_primitive_equals(218 context: Context,218 context: Context,219 _loc: &Option<ExprLocation>,219 _loc: Option<&ExprLocation>,220 args: &ArgsDesc,220 args: &ArgsDesc,221) -> Result<Val> {221) -> Result<Val> {222 parse_args!(context, "primitiveEquals", args, 2, [222 parse_args!(context, "primitiveEquals", args, 2, [228}228}229229230// faster230// faster231fn builtin_equals(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {231fn builtin_equals(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {232 parse_args!(context, "equals", args, 2, [232 parse_args!(context, "equals", args, 2, [233 0, a: ty!(any);233 0, a: ty!(any);234 1, b: ty!(any);234 1, b: ty!(any);237 })237 })238}238}239239240fn builtin_modulo(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {240fn builtin_modulo(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {241 parse_args!(context, "modulo", args, 2, [241 parse_args!(context, "modulo", args, 2, [242 0, a: ty!(number) => Val::Num;242 0, a: ty!(number) => Val::Num;243 1, b: ty!(number) => Val::Num;243 1, b: ty!(number) => Val::Num;246 })246 })247}247}248248249fn builtin_mod(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {249fn builtin_mod(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {250 parse_args!(context, "mod", args, 2, [250 parse_args!(context, "mod", args, 2, [251 0, a: ty!((number | string));251 0, a: ty!((number | string));252 1, b: ty!(any);252 1, b: ty!(any);259 })259 })260}260}261261262fn builtin_floor(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {262fn builtin_floor(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {263 parse_args!(context, "floor", args, 1, [263 parse_args!(context, "floor", args, 1, [264 0, x: ty!(number) => Val::Num;264 0, x: ty!(number) => Val::Num;265 ], {265 ], {266 Ok(Val::Num(x.floor()))266 Ok(Val::Num(x.floor()))267 })267 })268}268}269269270fn builtin_log(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {270fn builtin_log(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {271 parse_args!(context, "log", args, 1, [271 parse_args!(context, "log", args, 1, [272 0, n: ty!(number) => Val::Num;272 0, n: ty!(number) => Val::Num;273 ], {273 ], {274 Ok(Val::Num(n.ln()))274 Ok(Val::Num(n.ln()))275 })275 })276}276}277277278fn builtin_pow(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {278fn builtin_pow(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {279 parse_args!(context, "pow", args, 2, [279 parse_args!(context, "pow", args, 2, [280 0, x: ty!(number) => Val::Num;280 0, x: ty!(number) => Val::Num;281 1, n: ty!(number) => Val::Num;281 1, n: ty!(number) => Val::Num;284 })284 })285}285}286286287fn builtin_ext_var(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {287fn builtin_ext_var(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {288 parse_args!(context, "extVar", args, 1, [288 parse_args!(context, "extVar", args, 1, [289 0, x: ty!(string) => Val::Str;289 0, x: ty!(string) => Val::Str;290 ], {290 ], {291 Ok(with_state(|s| s.settings().ext_vars.get(&x).cloned()).ok_or(UndefinedExternalVariable(x))?)291 Ok(with_state(|s| s.settings().ext_vars.get(&x).cloned()).ok_or(UndefinedExternalVariable(x))?)292 })292 })293}293}294294295fn builtin_native(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {295fn builtin_native(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {296 parse_args!(context, "native", args, 1, [296 parse_args!(context, "native", args, 1, [297 0, x: ty!(string) => Val::Str;297 0, x: ty!(string) => Val::Str;298 ], {298 ], {299 Ok(with_state(|s| s.settings().ext_natives.get(&x).cloned()).map(|v| Val::Func(Rc::new(FuncVal::NativeExt(x.clone(), v)))).ok_or(UndefinedExternalFunction(x))?)299 Ok(with_state(|s| s.settings().ext_natives.get(&x).cloned()).map(|v| Val::Func(Rc::new(FuncVal::NativeExt(x.clone(), v)))).ok_or(UndefinedExternalFunction(x))?)300 })300 })301}301}302302303fn builtin_filter(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {303fn builtin_filter(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {304 parse_args!(context, "filter", args, 2, [304 parse_args!(context, "filter", args, 2, [305 0, func: ty!(function) => Val::Func;305 0, func: ty!(function) => Val::Func;306 1, arr: ty!(array) => Val::Arr;306 1, arr: ty!(array) => Val::Arr;318 })318 })319}319}320320321fn builtin_foldl(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {321fn builtin_foldl(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {322 parse_args!(context, "foldl", args, 3, [322 parse_args!(context, "foldl", args, 3, [323 0, func: ty!(function) => Val::Func;323 0, func: ty!(function) => Val::Func;324 1, arr: ty!(array) => Val::Arr;324 1, arr: ty!(array) => Val::Arr;332 })332 })333}333}334334335fn builtin_foldr(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {335fn builtin_foldr(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {336 parse_args!(context, "foldr", args, 3, [336 parse_args!(context, "foldr", args, 3, [337 0, func: ty!(function) => Val::Func;337 0, func: ty!(function) => Val::Func;338 1, arr: ty!(array) => Val::Arr;338 1, arr: ty!(array) => Val::Arr;349#[allow(non_snake_case)]349#[allow(non_snake_case)]350fn builtin_sort_impl(350fn builtin_sort_impl(351 context: Context,351 context: Context,352 _loc: &Option<ExprLocation>,352 _loc: Option<&ExprLocation>,353 args: &ArgsDesc,353 args: &ArgsDesc,354) -> Result<Val> {354) -> Result<Val> {355 parse_args!(context, "sort", args, 2, [355 parse_args!(context, "sort", args, 2, [364}364}365365366// faster366// faster367fn builtin_format(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {367fn builtin_format(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {368 parse_args!(context, "format", args, 2, [368 parse_args!(context, "format", args, 2, [369 0, str: ty!(string) => Val::Str;369 0, str: ty!(string) => Val::Str;370 1, vals: ty!(any)370 1, vals: ty!(any)373 })373 })374}374}375375376fn builtin_range(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {376fn builtin_range(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {377 parse_args!(context, "range", args, 2, [377 parse_args!(context, "range", args, 2, [378 0, from: ty!(number) => Val::Num;378 0, from: ty!(number) => Val::Num;379 1, to: ty!(number) => Val::Num;379 1, to: ty!(number) => Val::Num;386 })386 })387}387}388388389fn builtin_char(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {389fn builtin_char(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {390 parse_args!(context, "char", args, 1, [390 parse_args!(context, "char", args, 1, [391 0, n: ty!(number) => Val::Num;391 0, n: ty!(number) => Val::Num;392 ], {392 ], {400400401fn builtin_encode_utf8(401fn builtin_encode_utf8(402 context: Context,402 context: Context,403 _loc: &Option<ExprLocation>,403 _loc: Option<&ExprLocation>,404 args: &ArgsDesc,404 args: &ArgsDesc,405) -> Result<Val> {405) -> Result<Val> {406 parse_args!(context, "encodeUTF8", args, 1, [406 parse_args!(context, "encodeUTF8", args, 1, [410 })410 })411}411}412412413fn builtin_md5(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {413fn builtin_md5(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {414 parse_args!(context, "md5", args, 1, [414 parse_args!(context, "md5", args, 1, [415 0, str: ty!(string) => Val::Str;415 0, str: ty!(string) => Val::Str;416 ], {416 ], {417 Ok(Val::Str(format!("{:x}", md5::compute(&str.as_bytes())).into()))417 Ok(Val::Str(format!("{:x}", md5::compute(&str.as_bytes())).into()))418 })418 })419}419}420420421fn builtin_trace(context: Context, loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {421fn builtin_trace(context: Context, loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {422 parse_args!(context, "trace", args, 2, [422 parse_args!(context, "trace", args, 2, [423 0, str: ty!(string) => Val::Str;423 0, str: ty!(string) => Val::Str;424 1, rest: ty!(any);424 1, rest: ty!(any);435 })435 })436}436}437437438fn builtin_base64(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {438fn builtin_base64(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {439 parse_args!(context, "base64", args, 1, [439 parse_args!(context, "base64", args, 1, [440 0, input: ty!((string | (Array<number>)));440 0, input: ty!((string | (Array<number>)));441 ], {441 ], {453 })453 })454}454}455455456fn builtin_join(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {456fn builtin_join(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {457 parse_args!(context, "join", args, 2, [457 parse_args!(context, "join", args, 2, [458 0, sep: ty!((string | array));458 0, sep: ty!((string | array));459 1, arr: ty!(array) => Val::Arr;459 1, arr: ty!(array) => Val::Arr;513// faster513// faster514fn builtin_escape_string_json(514fn builtin_escape_string_json(515 context: Context,515 context: Context,516 _loc: &Option<ExprLocation>,516 _loc: Option<&ExprLocation>,517 args: &ArgsDesc,517 args: &ArgsDesc,518) -> Result<Val> {518) -> Result<Val> {519 parse_args!(context, "escapeStringJson", args, 1, [519 parse_args!(context, "escapeStringJson", args, 1, [526// faster526// faster527fn builtin_manifest_json_ex(527fn builtin_manifest_json_ex(528 context: Context,528 context: Context,529 _loc: &Option<ExprLocation>,529 _loc: Option<&ExprLocation>,530 args: &ArgsDesc,530 args: &ArgsDesc,531) -> Result<Val> {531) -> Result<Val> {532 parse_args!(context, "manifestJsonEx", args, 2, [532 parse_args!(context, "manifestJsonEx", args, 2, [541}541}542542543// faster543// faster544fn builtin_reverse(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {544fn builtin_reverse(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {545 parse_args!(context, "reverse", args, 1, [545 parse_args!(context, "reverse", args, 1, [546 0, value: ty!(array) => Val::Arr;546 0, value: ty!(array) => Val::Arr;547 ], {547 ], {548 Ok(Val::Arr(value.reversed()))548 Ok(Val::Arr(value.reversed()))549 })549 })550}550}551551552fn builtin_id(context: Context, _loc: &Option<ExprLocation>, args: &ArgsDesc) -> Result<Val> {552fn builtin_id(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {553 parse_args!(context, "id", args, 1, [553 parse_args!(context, "id", args, 1, [554 0, v: ty!(any);554 0, v: ty!(any);555 ], {555 ], {560// faster560// faster561fn builtin_str_replace(561fn builtin_str_replace(562 context: Context,562 context: Context,563 _loc: &Option<ExprLocation>,563 _loc: Option<&ExprLocation>,564 args: &ArgsDesc,564 args: &ArgsDesc,565) -> Result<Val> {565) -> Result<Val> {566 parse_args!(context, "strReplace", args, 3, [566 parse_args!(context, "strReplace", args, 3, [583 })583 })584}584}585585586#[allow(clippy::cognitive_complexity)]587pub fn call_builtin(586pub fn call_builtin(588 context: Context,587 context: Context,589 loc: &Option<ExprLocation>,588 loc: Option<&ExprLocation>,590 name: &str,589 name: &str,591 args: &ArgsDesc,590 args: &ArgsDesc,592) -> Result<Val> {591) -> Result<Val> {crates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth385 context: Context,385 context: Context,386 value: &LocExpr,386 value: &LocExpr,387 args: &ArgsDesc,387 args: &ArgsDesc,388 loc: &Option<ExprLocation>,388 loc: Option<&ExprLocation>,389 tailstrict: bool,389 tailstrict: bool,390) -> Result<Val> {390) -> Result<Val> {391 let value = evaluate(context.clone(), value)?;391 let value = evaluate(context.clone(), value)?;430 BinaryOp(v1, o, v2) => evaluate_binary_op_special(context, v1, *o, v2)?,430 BinaryOp(v1, o, v2) => evaluate_binary_op_special(context, v1, *o, v2)?,431 UnaryOp(o, v) => evaluate_unary_op(*o, &evaluate(context, v)?)?,431 UnaryOp(o, v) => evaluate_unary_op(*o, &evaluate(context, v)?)?,432 Var(name) => push(432 Var(name) => push(433 loc,433 loc.as_ref(),434 || format!("variable <{}>", name),434 || format!("variable <{}>", name),435 || Ok(context.binding(name.clone())?.evaluate()?),435 || Ok(context.binding(name.clone())?.evaluate()?),436 )?,436 )?,448 (Val::Obj(v), Val::Str(s)) => {448 (Val::Obj(v), Val::Str(s)) => {449 let sn = s.clone();449 let sn = s.clone();450 push(450 push(451 loc,451 loc.as_ref(),452 || format!("field <{}> access", sn),452 || format!("field <{}> access", sn),453 || {453 || {454 if let Some(v) = v.get(s.clone())? {454 if let Some(v) = v.get(s.clone())? {540 &evaluate(context.clone(), s)?,540 &evaluate(context.clone(), s)?,541 &Val::Obj(evaluate_object(context, t)?),541 &Val::Obj(evaluate_object(context, t)?),542 )?,542 )?,543 Apply(value, args, tailstrict) => evaluate_apply(context, value, args, loc, *tailstrict)?,543 Apply(value, args, tailstrict) => evaluate_apply(context, value, args, loc.as_ref(), *tailstrict)?,544 Function(params, body) => {544 Function(params, body) => {545 evaluate_method(context, "anonymous".into(), params.clone(), body.clone())545 evaluate_method(context, "anonymous".into(), params.clone(), body.clone())546 }546 }547 Intrinsic(name) => Val::Func(Rc::new(FuncVal::Intrinsic(name.clone()))),547 Intrinsic(name) => Val::Func(Rc::new(FuncVal::Intrinsic(name.clone()))),548 AssertExpr(AssertStmt(value, msg), returned) => {548 AssertExpr(AssertStmt(value, msg), returned) => {549 let assertion_result = push(549 let assertion_result = push(550 &value.1,550 value.1.as_ref(),551 || "assertion condition".to_owned(),551 || "assertion condition".to_owned(),552 || {552 || {553 evaluate(context.clone(), value)?553 evaluate(context.clone(), value)?558 evaluate(context, returned)?558 evaluate(context, returned)?559 } else {559 } else {560 push(560 push(561 &value.1,561 value.1.as_ref(),562 || "assertion failure".to_owned(),562 || "assertion failure".to_owned(),563 || {563 || {564 if let Some(msg) = msg {564 if let Some(msg) = msg {571 }571 }572 }572 }573 ErrorStmt(e) => push(573 ErrorStmt(e) => push(574 loc,574 loc.as_ref(),575 || "error statement".to_owned(),575 || "error statement".to_owned(),576 || {576 || {577 throw!(RuntimeError(577 throw!(RuntimeError(585 cond_else,585 cond_else,586 } => {586 } => {587 if push(587 if push(588 loc,588 loc.as_ref(),589 || "if condition".to_owned(),589 || "if condition".to_owned(),590 || evaluate(context.clone(), &cond.0)?.try_cast_bool("in if condition"),590 || evaluate(context.clone(), &cond.0)?.try_cast_bool("in if condition"),591 )? {591 )? {605 let import_location = Rc::make_mut(&mut tmp);605 let import_location = Rc::make_mut(&mut tmp);606 import_location.pop();606 import_location.pop();607 push(607 push(608 loc,608 loc.as_ref(),609 || format!("import {:?}", path),609 || format!("import {:?}", path),610 || with_state(|s| s.import_file(import_location, path)),610 || with_state(|s| s.import_file(import_location, path)),611 )?611 )?crates/jrsonnet-evaluator/src/function.rsdiffbeforeafterboth160 throw!(IntrinsicArgumentReorderingIsNotSupportedYet);160 throw!(IntrinsicArgumentReorderingIsNotSupportedYet);161 }161 }162 }162 }163 let $name = push(&None, || format!("evaluating argument"), || {163 let $name = push(None, || format!("evaluating argument"), || {164 let value = evaluate($ctx.clone(), &$name.1)?;164 let value = evaluate($ctx.clone(), &$name.1)?;165 $ty.check(&value)?;165 $ty.check(&value)?;166 Ok(value)166 Ok(value)crates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth128 EVAL_STATE.with(|s| f(s.borrow().as_ref().unwrap()))128 EVAL_STATE.with(|s| f(s.borrow().as_ref().unwrap()))129}129}130pub(crate) fn push<T>(130pub(crate) fn push<T>(131 e: &Option<ExprLocation>,131 e: Option<&ExprLocation>,132 frame_desc: impl FnOnce() -> String,132 frame_desc: impl FnOnce() -> String,133 f: impl FnOnce() -> Result<T>,133 f: impl FnOnce() -> Result<T>,134) -> Result<T> {134) -> Result<T> {crates/jrsonnet-evaluator/src/typed.rsdiffbeforeafterboth78}78}797980fn push_type(80fn push_type(81 location: &Option<ExprLocation>,81 location: Option<&ExprLocation>,82 error_reason: impl Fn() -> String,82 error_reason: impl Fn() -> String,83 path: impl Fn() -> ValuePathItem,83 path: impl Fn() -> ValuePathItem,84 item: impl Fn() -> Result<()>,84 item: impl Fn() -> Result<()>,162 Val::Arr(a) => {162 Val::Arr(a) => {163 for (i, item) in a.iter().enumerate() {163 for (i, item) in a.iter().enumerate() {164 push_type(164 push_type(165 &None,165 None,166 || format!("array index {}", i),166 || format!("array index {}", i),167 || ValuePathItem::Index(i as u64),167 || ValuePathItem::Index(i as u64),168 || Ok(elem_type.check(&item.clone()?)?),168 || Ok(elem_type.check(&item.clone()?)?),176 Val::Arr(a) => {176 Val::Arr(a) => {177 for (i, item) in a.iter().enumerate() {177 for (i, item) in a.iter().enumerate() {178 push_type(178 push_type(179 &None,179 None,180 || format!("array index {}", i),180 || format!("array index {}", i),181 || ValuePathItem::Index(i as u64),181 || ValuePathItem::Index(i as u64),182 || Ok(elem_type.check(&item.clone()?)?),182 || Ok(elem_type.check(&item.clone()?)?),191 for (k, v) in elems.iter() {191 for (k, v) in elems.iter() {192 if let Some(got_v) = obj.get((*k).into())? {192 if let Some(got_v) = obj.get((*k).into())? {193 push_type(193 push_type(194 &None,194 None,195 || format!("property {}", k),195 || format!("property {}", k),196 || ValuePathItem::Field((*k).into()),196 || ValuePathItem::Field((*k).into()),197 || v.check(&got_v),197 || v.check(&got_v),crates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth102 pub fn evaluate(102 pub fn evaluate(103 &self,103 &self,104 call_ctx: Context,104 call_ctx: Context,105 loc: &Option<ExprLocation>,105 loc: Option<&ExprLocation>,106 args: &ArgsDesc,106 args: &ArgsDesc,107 tailstrict: bool,107 tailstrict: bool,108 ) -> Result<Val> {108 ) -> Result<Val> {