git.delta.rocks / jrsonnet / refs/commits / 7d331b668f37

difftreelog

fix object destruction leftovers check should account for defaults

Yaroslav Bolyukin2024-08-15parent: #e12ba8d.patch.diff
in: master

1 file changed

modifiedcrates/jrsonnet-evaluator/src/evaluate/destructure.rsdiffbeforeafterboth
170 #[derive(Trace)]170 #[derive(Trace)]
171 struct DataThunk {171 struct DataThunk {
172 parent: Thunk<Val>,172 parent: Thunk<Val>,
173 field_names: Vec<IStr>,173 field_names: Vec<(IStr, bool)>,
174 has_rest: bool,174 has_rest: bool,
175 }175 }
176 impl ThunkValue for DataThunk {176 impl ThunkValue for DataThunk {
181 let Val::Obj(obj) = v else {181 let Val::Obj(obj) = v else {
182 bail!("expected object");182 bail!("expected object");
183 };183 };
184 for field in &self.field_names {184 for (field, has_default) in &self.field_names {
185 if !obj.has_field_ex(field.clone(), true) {185 if !has_default && !obj.has_field_ex(field.clone(), true) {
186 bail!("missing field: {field}");186 bail!("missing field: {field}");
187 }187 }
188 }188 }
189 if !self.has_rest {189 if !self.has_rest {
190 let len = obj.len();190 let len = obj.len();
191 if len != self.field_names.len() {191 if len > self.field_names.len() {
192 bail!("too many fields, and rest not found");192 bail!("too many fields, and rest not found");
193 }193 }
194 }194 }
197 }197 }
198 let field_names: Vec<_> = fields198 let field_names: Vec<_> = fields
199 .iter()199 .iter()
200 .filter(|f| f.2.is_none())
201 .map(|f| f.0.clone())200 .map(|f| (f.0.clone(), f.2.is_some()))
202 .collect();201 .collect();
203 let full = Thunk::new(DataThunk {202 let full = Thunk::new(DataThunk {
204 parent,203 parent,