difftreelog
fix object destruction leftovers check should account for defaults
in: master
1 file changed
crates/jrsonnet-evaluator/src/evaluate/destructure.rsdiffbeforeafterboth170 #[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<_> = fields199 .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,