From 3214093c73886bb7696513e156d452914cf721d8 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Sun, 24 Jan 2021 12:03:46 +0000 Subject: [PATCH] fix: restore ability to edit arrays in libjsonnet --- --- a/bindings/jsonnet/src/val_make.rs +++ b/bindings/jsonnet/src/val_make.rs @@ -1,9 +1,10 @@ //! Create values in VM -use jrsonnet_evaluator::{EvaluationState, ObjValue, Val}; +use jrsonnet_evaluator::{ArrValue, EvaluationState, ObjValue, Val}; use std::{ ffi::CStr, os::raw::{c_char, c_double, c_int}, + rc::Rc, }; /// # Safety @@ -37,7 +38,7 @@ #[no_mangle] pub extern "C" fn jsonnet_json_make_array(_vm: &EvaluationState) -> *mut Val { - todo!() + Box::into_raw(Box::new(Val::Arr(ArrValue::Eager(Rc::new(Vec::new()))))) } #[no_mangle] --- a/bindings/jsonnet/src/val_modify.rs +++ b/bindings/jsonnet/src/val_modify.rs @@ -2,7 +2,9 @@ //! Only tested with variables, which haven't altered by code before appearing here //! In jrsonnet every value is immutable, and this code is probally broken -use jrsonnet_evaluator::{EvaluationState, LazyBinding, LazyVal, ObjMember, ObjValue, Val}; +use jrsonnet_evaluator::{ + ArrValue, EvaluationState, LazyBinding, LazyVal, ObjMember, ObjValue, Val, +}; use jrsonnet_parser::Visibility; use std::{collections::HashMap, ffi::CStr, os::raw::c_char, rc::Rc}; @@ -12,10 +14,20 @@ #[no_mangle] pub unsafe extern "C" fn jsonnet_json_array_append( _vm: &EvaluationState, - _arr: *mut Val, - _val: &Val, + arr: &mut Val, + val: &Val, ) { - todo!() + match arr { + Val::Arr(old) => { + let mut new = Vec::new(); + for item in old.iter_lazy() { + new.push(item); + } + new.push(LazyVal::new_resolved(val.clone())); + *arr = Val::Arr(ArrValue::Lazy(Rc::new(new))); + } + _ => panic!("should receive array"), + } } /// # Safety -- gitstuff