about summary refs log tree commit diff
path: root/tvix
diff options
context:
space:
mode:
Diffstat (limited to 'tvix')
-rw-r--r--tvix/cli/src/main.rs2
-rw-r--r--tvix/cli/src/repl.rs15
2 files changed, 16 insertions, 1 deletions
diff --git a/tvix/cli/src/main.rs b/tvix/cli/src/main.rs
index 486de4aca4a9..292a223cbb1a 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<Level>,
diff --git a/tvix/cli/src/repl.rs b/tvix/cli/src/repl.rs
index a970aa1ba75d..5a4830a027bc 100644
--- a/tvix/cli/src/repl.rs
+++ b/tvix/cli/src/repl.rs
@@ -18,6 +18,7 @@ fn state_dir() -> Option<PathBuf> {
 pub enum ReplCommand<'a> {
     Expr(&'a str),
     Explain(&'a str),
+    Print(&'a str),
     Quit,
     Help,
 }
@@ -30,6 +31,7 @@ The following commands are supported:
 
   <expr>    Evaluate a Nix language expression and print the result, along with its inferred type
   :d <expr> Evaluate a Nix language expression and print a detailed description of the result
+  :p <expr> 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 {