difftreelog
feat lazily evaluate source field in mergePatch
in: master
5 files changed
crates/jrsonnet-evaluator/src/obj.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/obj.rs
+++ b/crates/jrsonnet-evaluator/src/obj.rs
@@ -1183,6 +1183,12 @@
let entry = receiver.0.new.this_entries.entry(name);
entry.insert_entry(member);
}
+ /// Inserts thunk, replacing if it is already defined
+ pub fn thunk(self, value: impl Into<Thunk<Val>>) {
+ let (receiver, name, member) = self.build_member(MaybeUnbound::Bound(value.into()));
+ let entry = receiver.0.new.this_entries.entry(name);
+ entry.insert_entry(member);
+ }
/// Tries to insert value, returns an error if it was already defined
pub fn try_value(self, value: impl Into<Val>) -> Result<()> {
crates/jrsonnet-formatter/src/lib.rsdiffbeforeafterboth5 condition_helpers::is_multiple_lines,5 condition_helpers::is_multiple_lines,6 condition_resolvers::true_resolver,6 condition_resolvers::true_resolver,7 ir_helpers::{new_line_group, with_indent},7 ir_helpers::{new_line_group, with_indent},8 ConditionResolver, ConditionResolverContext, LineNumber, PrintItemPath, PrintItems,8 ConditionResolver, ConditionResolverContext, LineNumber, PrintItems, PrintOptions,9 PrintOptions, Signal,10};9};11use hi_doc::{Formatting, SnippetBuilder};10use hi_doc::{Formatting, SnippetBuilder};12use jrsonnet_rowan_parser::{11use jrsonnet_rowan_parser::{13 nodes::{12 nodes::{14 Arg, ArgsDesc, Assertion, BinaryOperator, Bind, CompSpec, Destruct, DestructArrayPart,13 Arg, ArgsDesc, Assertion, BinaryOperator, Bind, CompSpec, Destruct, DestructArrayPart,15 DestructRest, Expr, ExprBase, FieldName, ForSpec, IfSpec, ImportKind, Literal, Member,14 DestructRest, Expr, ExprBase, FieldName, ForSpec, IfSpec, ImportKind, Literal, Member,16 Name, Number, ObjBody, ObjLocal, ParamsDesc, SliceDesc, SourceFile, Stmt, Suffix, Text,15 Name, Number, ObjBody, ObjLocal, ParamsDesc, SliceDesc, SourceFile, Stmt, Suffix, Text,17 Trivia, TriviaKind, UnaryOperator, Visibility,16 UnaryOperator, Visibility,18 },17 },19 AstNode, AstToken as _, SyntaxToken,18 AstNode, AstToken as _, SyntaxToken,20};19};crates/jrsonnet-stdlib/src/misc.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/misc.rs
+++ b/crates/jrsonnet-stdlib/src/misc.rs
@@ -201,7 +201,9 @@
let mut out = ObjValueBuilder::new();
for field in target_fields.union(&patch_fields) {
let Some(field_patch) = patch.get(field.clone())? else {
- out.field(field.clone()).value(target.get(field.clone())?.expect("we're iterating over fields union, if field is missing in patch - it exists in target"));
+ // All lazy fields might be unified into a single filtered object core instead of creating a thunk per, but this implementation is good enough.
+ let target_field = target.get_lazy(field.clone()).expect("we're iterating over fields union, if field is missing in patch - it exists in target");
+ out.field(field.clone()).thunk(target_field);
continue;
};
if matches!(field_patch, Val::Null) {
tests/golden/issue188.jsonnetdiffbeforeafterboth--- /dev/null
+++ b/tests/golden/issue188.jsonnet
@@ -0,0 +1 @@
+std.mergePatch({ val: error 'should not error' }, {}) + { val+:: {} }
tests/golden/issue188.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/golden/issue188.jsonnet.golden
@@ -0,0 +1 @@
+{ }
\ No newline at end of file