difftreelog
refactor(evaluator) replace Binding with LazyBinding
in: master
4 files changed
crates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth1use crate::{1use crate::{2 binding, context_creator, create_error, future_wrapper, lazy_val, push, with_state, Context,2 context_creator, create_error, future_wrapper, lazy_val, push, with_state, Context,3 ContextCreator, FuncDesc, LazyBinding, ObjMember, ObjValue, Result, Val,3 ContextCreator, FuncDesc, LazyBinding, LazyVal, ObjMember, ObjValue, Result, Val,4};4};5use closure::closure;5use closure::closure;6use jsonnet_parser::{6use jsonnet_parser::{252 ObjMember {252 ObjMember {253 add: plus,253 add: plus,254 visibility: visibility.clone(),254 visibility: visibility.clone(),255 invoke: binding!(255 invoke: LazyBinding::Bindable(Rc::new(256 closure!(clone name, clone value, clone context_creator, |this, super_obj| {256 closure!(clone name, clone value, clone context_creator, |this, super_obj| {257 push(value.clone(), "object ".to_owned()+&name+" field", ||{257 Ok(LazyVal::new_resolved(push(value.clone(), "object ".to_owned()+&name+" field", ||{258 let context = context_creator.0(this, super_obj)?;258 let context = context_creator.0(this, super_obj)?;259 evaluate(259 evaluate(260 context,260 context,261 &value,261 &value,262 )?.unwrap_if_lazy()262 )?.unwrap_if_lazy()263 })263 })?))264 })264 }),265 ),265 )),266 },266 },267 );267 );268 }268 }282 ObjMember {282 ObjMember {283 add: false,283 add: false,284 visibility: Visibility::Hidden,284 visibility: Visibility::Hidden,285 invoke: binding!(285 invoke: LazyBinding::Bindable(Rc::new(286 closure!(clone value, clone context_creator, |this, super_obj| {286 closure!(clone value, clone context_creator, |this, super_obj| {287 // TODO: Assert287 // TODO: Assert288 Ok(evaluate_method(288 Ok(LazyVal::new_resolved(evaluate_method(289 context_creator.0(this, super_obj)?,289 context_creator.0(this, super_obj)?,290 params.clone(),290 params.clone(),291 value.clone(),291 value.clone(),292 ))292 )))293 })293 }),294 ),294 )),295 },295 },296 );296 );297 }297 }crates/jsonnet-evaluator/src/lib.rsdiffbeforeafterboth22use std::{cell::RefCell, collections::HashMap, fmt::Debug, path::PathBuf, rc::Rc};22use std::{cell::RefCell, collections::HashMap, fmt::Debug, path::PathBuf, rc::Rc};23pub use val::*;23pub use val::*;2425rc_fn_helper!(26 Binding,27 binding,28 dyn Fn(Option<ObjValue>, Option<ObjValue>) -> Result<Val>29);302431type BindableFn = dyn Fn(Option<ObjValue>, Option<ObjValue>) -> Result<LazyVal>;25type BindableFn = dyn Fn(Option<ObjValue>, Option<ObjValue>) -> Result<LazyVal>;32#[derive(Clone)]26#[derive(Clone)]crates/jsonnet-evaluator/src/map.rsdiffbeforeafterboth18 }))18 }))19 }19 }202021 #[inline(always)]21 pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V>22 pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V>22 where23 where23 K: Borrow<Q>,24 K: Borrow<Q>,crates/jsonnet-evaluator/src/obj.rsdiffbeforeafterboth1use crate::{evaluate_add_op, Binding, Result, Val};1use crate::{evaluate_add_op, LazyBinding, Result, Val};2use indexmap::IndexMap;2use indexmap::IndexMap;3use jsonnet_parser::Visibility;3use jsonnet_parser::Visibility;4use std::{4use std::{12pub struct ObjMember {12pub struct ObjMember {13 pub add: bool,13 pub add: bool,14 pub visibility: Visibility,14 pub visibility: Visibility,15 pub invoke: Binding,15 pub invoke: LazyBinding,16}16}171718#[derive(Debug)]18#[derive(Debug)]102 }102 }103 pub(crate) fn get_raw(&self, key: &str, real_this: &ObjValue) -> Result<Option<Val>> {103 pub(crate) fn get_raw(&self, key: &str, real_this: &ObjValue) -> Result<Option<Val>> {104 match (self.0.this_entries.get(key), &self.0.super_obj) {104 match (self.0.this_entries.get(key), &self.0.super_obj) {105 (Some(k), None) => Ok(Some(k.invoke.0(105 (Some(k), None) => Ok(Some(106 k.invoke106 Some(real_this.clone()),107 .evaluate(Some(real_this.clone()), self.0.super_obj.clone())?107 self.0.super_obj.clone(),108 )?)),108 .evaluate()?,109 )),109 (Some(k), Some(s)) => {110 (Some(k), Some(s)) => {110 let our = k.invoke.0(Some(real_this.clone()), self.0.super_obj.clone())?;111 let our = k112 .invoke113 .evaluate(Some(real_this.clone()), self.0.super_obj.clone())?114 .evaluate()?;111 if k.add {115 if k.add {112 s.get_raw(key, real_this)?116 s.get_raw(key, real_this)?113 .map_or(Ok(Some(our.clone())), |v| {117 .map_or(Ok(Some(our.clone())), |v| {