feat(tvix/repl): Add a command to recursively print

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 = <CODE>; } :: 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 <root@gws.fyi>
Tested-by: BuildkiteCI
Reviewed-by: flokli <flokli@flokli.de>
This commit is contained in:
Aspen Smith 2024-05-27 16:38:06 -04:00 committed by clbot
parent 4a489d930c
commit c2f649f62e
2 changed files with 16 additions and 1 deletions

View file

@ -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>,

View file

@ -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 {