git.delta.rocks / jrsonnet / refs/commits / 2c8a29e649b8

difftreelog

feat(bindings) object append

Лач2020-06-28parent: #27ecbf0.patch.diff
in: master

1 file changed

modifiedbindings/jsonnet/src/lib.rsdiffbeforeafterboth
157pub extern "C" fn jsonnet_json_array_append(_vm: &EvaluationState, arr: &mut Val, val: &Val) {157pub extern "C" fn jsonnet_json_array_append(_vm: &EvaluationState, arr: &mut Val, val: &Val) {
158 match arr {158 match arr {
159 Val::Arr(old) => {159 Val::Arr(old) => {
160 // TODO: Mutate array, instead of recreating them
160 let mut new = Vec::new();161 let mut new = Vec::new();
161 new.extend(old.iter().cloned());162 new.extend(old.iter().cloned());
162 new.push(val.clone());163 new.push(val.clone());
171 Box::new(Val::Obj(ObjValue::new_empty()))172 Box::new(Val::Obj(ObjValue::new_empty()))
172}173}
173174
175/// # Safety
176///
177/// This function is safe if passed name is ok
174#[no_mangle]178#[no_mangle]
175pub extern "C" fn jsonnet_json_object_append(179pub unsafe extern "C" fn jsonnet_json_object_append(
176 _vm: &EvaluationState,180 _vm: &EvaluationState,
177 _obj: &mut Val,181 obj: &mut Val,
178 _name: *const c_char,182 name: *const c_char,
179 _val: &Val,183 val: &Val,
180) {184) {
185 match obj {
186 Val::Obj(old) => {
187 let mut new = BTreeMap::new();
188 new.insert(
189 CStr::from_ptr(name).to_str().unwrap().into(),
190 ObjMember {
191 add: false,
192 visibility: Visibility::Normal,
193 invoke: LazyBinding::Bound(LazyVal::new_resolved(val.clone())),
194 },
195 );
196 let new_obj = ObjValue::new(Some(old.clone()), Rc::new(new));
197 *obj = Val::Obj(new_obj);
198 }
181 todo!()199 _ => panic!("should receive array"),
200 }
182}201}
183202
184/// # Safety203/// # Safety