--- a/crates/jrsonnet-evaluator/src/lib.rs +++ b/crates/jrsonnet-evaluator/src/lib.rs @@ -193,8 +193,10 @@ pub(crate) fn import_file(&self, from: &PathBuf, path: &PathBuf) -> Result { let file_path = self.resolve_file(from, path)?; { - let files = &self.data().files; + let data = self.data(); + let files = &data.files; if files.contains_key(&file_path) { + drop(data); return self.evaluate_loaded_file_raw(&file_path); } } @@ -901,4 +903,26 @@ ); Ok(()) } + + struct TestImportResolver(Rc); + impl crate::import::ImportResolver for TestImportResolver { + fn resolve_file(&self, _: &PathBuf, _: &PathBuf) -> crate::error::Result> { + Ok(Rc::new(PathBuf::from("/test"))) + } + + fn load_file_contents(&self, _: &PathBuf) -> crate::error::Result> { + Ok(self.0.clone()) + } + + unsafe fn as_any(&self) -> &dyn std::any::Any { + panic!() + } + } + + #[test] + fn issue_23() { + let state = EvaluationState::default(); + state.set_import_resolver(Box::new(TestImportResolver(r#"import "/test""#.into()))); + let _ = state.evaluate_file_raw(&PathBuf::from("/test")); + } }