git.delta.rocks / jrsonnet / refs/commits / ce9e7d90ad74

difftreelog

feat(evaluator) run_in_state helper

Лач2020-06-25parent: #30d0357.patch.diff
in: master

1 file changed

modifiedcrates/jsonnet-evaluator/src/lib.rsdiffbeforeafterboth
142 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_map
159 }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.0
165 .files160 .files
170 .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 }
210206
211 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 value
216 }209 }
217210
218 pub fn add_global(&self, name: String, value: Val) {211 pub fn add_global(&self, name: String, value: Val) {
223 }216 }
224217
225 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 self
244 }240 }
245241
291 Err(LocError(err, self.stack_trace()))287 Err(LocError(err, self.stack_trace()))
292 }288 }
293289
290 #[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 result
304 })
296 }305 }
297 fn end_state(&self) {
298 EVAL_STATE.with(|v| v.borrow_mut().take());
299 }
300}306}
301307
302#[cfg(test)]308#[cfg(test)]