difftreelog
feat(evaluator) run_in_state helper
in: master
1 file changed
crates/jsonnet-evaluator/src/lib.rsdiffbeforeafterboth142 let ro_map = self.0.files.borrow();142 let ro_map = self.0.files.borrow();143 ro_map.get(name).map(|value| value.0.clone())143 ro_map.get(name).map(|value| value.0.clone())144 }144 }145 pub fn evaluate_file(&self, name: &PathBuf) -> Result<Val> {145 pub fn evaluate_file(&self, name: &PathBuf) -> Result<Val> {146 self.begin_state();147 let value = self.evaluate_file_in_current_state(name)?;148 self.end_state();149 Ok(value)150 }151 pub(crate) fn evaluate_file_in_current_state(&self, name: &PathBuf) -> Result<Val> {146 self.run_in_state(|| {152 let expr: LocExpr = {147 let expr: LocExpr = {153 let ro_map = self.0.files.borrow();148 let ro_map = self.0.files.borrow();154 let value = ro_map149 let value = ro_map159 }154 }160 value.1.clone()155 value.1.clone()161 };156 };162 let value = evaluate(self.create_default_context()?, &expr)?;157 let value = evaluate(&self.create_default_context()?, &expr)?;163 {158 {164 self.0159 self.0165 .files160 .files170 .replace(value.clone());165 .replace(value.clone());171 }166 }172 Ok(value)167 Ok(value)173 }168 })169 }174 pub(crate) fn import_file(&self, from: &PathBuf, path: &PathBuf) -> Result<Val> {170 pub(crate) fn import_file(&self, from: &PathBuf, path: &PathBuf) -> Result<Val> {175 let file_path = self.0.import_resolver.resolve_file(from, path)?;171 let file_path = self.0.import_resolver.resolve_file(from, path)?;176 {172 {209 }205 }210206211 pub fn evaluate_raw(&self, code: LocExpr) -> Result<Val> {207 pub fn evaluate_raw(&self, code: LocExpr) -> Result<Val> {212 self.begin_state();213 let value = evaluate(self.create_default_context()?, &code);208 self.run_in_state(|| evaluate(&self.create_default_context()?, &code))214 self.end_state();215 value216 }209 }217210218 pub fn add_global(&self, name: String, value: Val) {211 pub fn add_global(&self, name: String, value: Val) {223 }216 }224217225 pub fn with_stdlib(&self) -> &Self {218 pub fn with_stdlib(&self) -> &Self {226 self.begin_state();219 self.run_in_state(|| {227 use jsonnet_stdlib::STDLIB_STR;220 use jsonnet_stdlib::STDLIB_STR;228 if cfg!(feature = "serialized-stdlib") {221 if cfg!(feature = "serialized-stdlib") {229 self.add_parsed_file(222 self.add_parsed_file(239 }235 }240 let val = self.evaluate_file(&PathBuf::from("std.jsonnet")).unwrap();236 let val = self.evaluate_file(&PathBuf::from("std.jsonnet")).unwrap();241 self.add_global("std".to_owned(), val);237 self.add_global("std".to_owned(), val);242 self.end_state();238 });243 self239 self244 }240 }245241291 Err(LocError(err, self.stack_trace()))287 Err(LocError(err, self.stack_trace()))292 }288 }293289290 #[inline(always)]294 fn begin_state(&self) {291 fn run_in_state<T>(&self, f: impl FnOnce() -> T) -> T {295 EVAL_STATE.with(|v| v.borrow_mut().replace(self.clone()));292 EVAL_STATE.with(|v| {293 let has_state = v.borrow().is_some();294 if !has_state {295 println!("Begin state");296 v.borrow_mut().replace(self.clone());297 }298 let result = f();299 if !has_state {300 println!("End state");301 v.borrow_mut().take();302 }303 result304 })296 }305 }297 fn end_state(&self) {298 EVAL_STATE.with(|v| v.borrow_mut().take());299 }300}306}301307302#[cfg(test)]308#[cfg(test)]