diff --git a/tvix/cli/src/main.rs b/tvix/cli/src/main.rs index 486de4aca..292a223cb 100644 --- a/tvix/cli/src/main.rs +++ b/tvix/cli/src/main.rs @@ -18,7 +18,7 @@ use tvix_glue::tvix_io::TvixIO; use tvix_glue::tvix_store_io::TvixStoreIO; use tvix_glue::{builtins::add_derivation_builtins, configure_nix_path}; -#[derive(Parser)] +#[derive(Parser, Clone)] struct Args { #[arg(long)] log_level: Option, diff --git a/tvix/cli/src/repl.rs b/tvix/cli/src/repl.rs index a970aa1ba..5a4830a02 100644 --- a/tvix/cli/src/repl.rs +++ b/tvix/cli/src/repl.rs @@ -18,6 +18,7 @@ fn state_dir() -> Option { pub enum ReplCommand<'a> { Expr(&'a str), Explain(&'a str), + Print(&'a str), Quit, Help, } @@ -30,6 +31,7 @@ The following commands are supported: Evaluate a Nix language expression and print the result, along with its inferred type :d Evaluate a Nix language expression and print a detailed description of the result + :p Evaluate a Nix language expression and print the result recursively :q Exit the REPL :?, :h Display this help text "; @@ -38,6 +40,8 @@ The following commands are supported: if input.starts_with(':') { if let Some(without_prefix) = input.strip_prefix(":d ") { return Self::Explain(without_prefix); + } else if let Some(without_prefix) = input.strip_prefix(":p ") { + return Self::Print(without_prefix); } let input = input.trim_end(); @@ -130,6 +134,17 @@ impl Repl { true, AllowIncomplete::Allow, ), + ReplCommand::Print(input) => interpret( + Rc::clone(&io_handle), + input, + None, + &Args { + strict: true, + ..(args.clone()) + }, + false, + AllowIncomplete::Allow, + ), }; match res {