diff --git a/src/cmd/eval.rs b/src/cmd/eval.rs index 950dcc3..677c1fe 100644 --- a/src/cmd/eval.rs +++ b/src/cmd/eval.rs @@ -28,7 +28,10 @@ pub fn handle_cmd(parsed_args: &ArgMatches) -> Result<(), NixError> { let expr = parsed_args .get_one::("expr") .ok_or("You must use the '--expr' option. Nothing else is implemented :)")?; - print_value(&execution::evaluate(expr)?); + + let current_dir = std::env::current_dir().map_err(|_| "Couldn't get the current directory")?; + + print_value(&execution::evaluate(expr, ¤t_dir)?); println!(); Ok(()) } diff --git a/src/eval/execution.rs b/src/eval/execution.rs index c60a474..b7303cb 100644 --- a/src/eval/execution.rs +++ b/src/eval/execution.rs @@ -1,4 +1,3 @@ -use std::env::current_dir; use std::path::Path; use std::sync::Once; @@ -13,7 +12,7 @@ use super::types::js_value_to_nix; static INIT_V8: Once = Once::new(); -pub fn evaluate(nix_expr: &str) -> EvalResult { +pub fn evaluate(nix_expr: &str, workdir: &Path) -> EvalResult { initialize_v8(); // Declare the V8 execution context let isolate = &mut v8::Isolate::new(Default::default()); @@ -53,7 +52,7 @@ pub fn evaluate(nix_expr: &str) -> EvalResult { let root_nix_fn = nix_expr_to_js_function(scope, nix_expr)?; - nix_value_from_module(scope, root_nix_fn, nixjs_rt_obj) + nix_value_from_module(scope, root_nix_fn, nixjs_rt_obj, workdir) } fn nix_expr_to_js_function<'s>( @@ -170,20 +169,15 @@ fn initialize_v8() { fn nix_value_from_module( scope: &mut v8::ContextScope, - nix_value: v8::Local, + nix_module_fn: v8::Local, nixjs_rt_obj: v8::Local, + workdir: &Path, ) -> EvalResult { let nixrt: v8::Local = nixjs_rt_obj.into(); - let eval_ctx = create_eval_ctx( - scope, - &nixrt, - ¤t_dir().map_err(|err| { - format!("Failed to determine the current working directory. Error: {err}") - })?, - )?; + let eval_ctx = create_eval_ctx(scope, &nixrt, workdir)?; - let nix_value = call_js_function(scope, &nix_value, nixjs_rt_obj, &[eval_ctx.into()])?; + let nix_value = call_js_function(scope, &nix_module_fn, nixjs_rt_obj, &[eval_ctx.into()])?; let to_strict_fn: v8::Local = try_get_js_object_key(scope, &nixrt, "recursiveStrict")? diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 5ae6b1e..04cd910 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -15,18 +15,17 @@ mod literals; mod operators; fn eval_ok(nix_expr: &str) -> Value { - match evaluate(nix_expr) { + let workdir = std::env::current_dir().unwrap(); + match evaluate(nix_expr, &workdir) { Ok(val) => val, - Err(err) => panic!( - "eval '{}' shouldn't fail.\nError message: {}", - nix_expr, err - ), + Err(err) => panic!("eval '{nix_expr}' shouldn't fail.\nError message: {err:?}",), } } fn eval_err(nix_expr: &str) -> NixErrorKind { - evaluate(nix_expr) - .expect_err(&format!("eval '{}' expected an error", nix_expr)) + let workdir = std::env::current_dir().unwrap(); + evaluate(nix_expr, &workdir) + .expect_err(&format!("eval '{nix_expr}' expected an error")) .kind }