From c2f649f62e041afd75ad68ef1b4fe46a3fec8f4b Mon Sep 17 00:00:00 2001 From: Aspen Smith Date: Mon, 27 May 2024 16:38:06 -0400 Subject: feat(tvix/repl): Add a command to recursively print MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a command, :p, to evaluate an expression and recursively print the result, as if `--strict` had been passed on the command line. Demonstration of this working: ❯ cargo r --bin tvix Finished dev [unoptimized + debuginfo] target(s) in 0.27s Running `target/debug/tvix` tvix-repl> { x = (x: x) 1; } => { x = ; } :: set tvix-repl> :p { x = (x: x) 1; } => { x = 1; } :: set Change-Id: I1a81d7481160c30d2a4483c6308e25fa45f2dfdf Reviewed-on: https://cl.tvl.fyi/c/depot/+/11738 Autosubmit: aspen Tested-by: BuildkiteCI Reviewed-by: flokli --- tvix/cli/src/main.rs | 2 +- tvix/cli/src/repl.rs | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) 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, 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 { 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 { -- cgit 1.4.1