difftreelog
refactor extract standard library to another module
in: master
3 files changed
crates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-evaluator/src/builtin/mod.rs
@@ -0,0 +1,2 @@
+pub mod stdlib;
+pub use stdlib::*;
crates/jrsonnet-evaluator/src/builtin/stdlib.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-evaluator/src/builtin/stdlib.rs
@@ -0,0 +1,37 @@
+use jrsonnet_parser::{LocExpr, ParserSettings};
+use std::{path::PathBuf, rc::Rc};
+
+thread_local! {
+ /// To avoid parsing again when issued from same thread
+ #[allow(unreachable_code)]
+ static PARSED_STDLIB: LocExpr = {
+ #[cfg(feature = "codegenerated-stdlib")]
+ {
+ #[allow(clippy::all)]
+ return {
+ use jrsonnet_parser::*;
+ include!(concat!(env!("OUT_DIR"), "/stdlib.rs"))
+ };
+ }
+
+ #[cfg(feature = "serialized-stdlib")]
+ {
+ // Should not panic, stdlib.bincode is generated in build.rs
+ return bincode::deserialize(include_bytes!(concat!(env!("OUT_DIR"), "/stdlib.bincode")))
+ .unwrap();
+ }
+
+ jrsonnet_parser::parse(
+ &jrsonnet_stdlib::STDLIB_STR,
+ &ParserSettings {
+ loc_data: true,
+ file_name: Rc::new(PathBuf::from("std.jsonnet")),
+ },
+ )
+ .unwrap()
+ }
+}
+
+pub fn get_parsed_stdlib() -> LocExpr {
+ PARSED_STDLIB.with(|t| t.clone())
+}
crates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth262 self.run_in_state(|| evaluate(self.create_default_context()?, &code))262 self.run_in_state(|| evaluate(self.create_default_context()?, &code))263 }263 }264264265 pub fn add_global(&self, name: Rc<str>, value: Val) {265 /// Adds standard library global variable (std) to this evaluator266 self.settings_mut().globals.insert(name, value);267 }268 pub fn add_ext_var(&self, name: Rc<str>, value: Val) {269 self.settings_mut().ext_vars.insert(name, value);270 }271 pub fn set_max_trace(&self, max_trace: usize) {272 self.settings_mut().max_stack_trace_size = max_trace;273 }274 pub fn set_max_stack(&self, max_stack: usize) {275 self.settings_mut().max_stack_frames = max_stack;276 }277278 pub fn with_stdlib(&self) -> &Self {266 pub fn with_stdlib(&self) -> &Self {267 use jrsonnet_stdlib::STDLIB_STR;279 let std_path = Rc::new(PathBuf::from("std.jsonnet"));268 let std_path = Rc::new(PathBuf::from("std.jsonnet"));280 self.run_in_state(|| {269 self.run_in_state(|| {281 use jrsonnet_stdlib::STDLIB_STR;282 let mut parsed = false;283 #[cfg(feature = "codegenerated-stdlib")]284 if !parsed {285 parsed = true;286 #[allow(clippy::all)]287 let stdlib = {288 use jrsonnet_parser::*;289 include!(concat!(env!("OUT_DIR"), "/stdlib.rs"))290 };291 self.add_parsed_file(std_path.clone(), STDLIB_STR.to_owned().into(), stdlib)292 .unwrap();293 }294295 #[cfg(feature = "serialized-stdlib")]296 if !parsed {297 parsed = true;298 self.add_parsed_file(270 self.add_parsed_file(299 std_path.clone(),271 std_path.clone(),300 STDLIB_STR.to_owned().into(),272 STDLIB_STR.to_owned().into(),301 bincode::deserialize(include_bytes!(concat!(273 builtin::get_parsed_stdlib(),302 env!("OUT_DIR"),303 "/stdlib.bincode"304 )))305 .expect("deserialize stdlib"),306 )274 )307 .unwrap();275 .unwrap();308 }309310 if !parsed {311 self.add_file(std_path, STDLIB_STR.to_owned().into())312 .unwrap();313 }314 let val = self.evaluate_file(&PathBuf::from("std.jsonnet")).unwrap();276 let val = self.evaluate_file(&std_path).unwrap();315 self.add_global("std".into(), val);277 self.settings_mut().globals.insert("std".into(), val);316 });278 });317 self279 self318 }280 }