refactor(tvix/repl): Abstract out REPL command handling
Prepare for introducing additional REPL commands by splitting out the *parsing* of the repl commands, which returns a new ReplCommand type, from the actual *handling* of the commands. Change-Id: If81a53c1e2d90204d26ce3bb2ea9eebf7bb3fd51 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11734 Autosubmit: aspen <root@gws.fyi> Tested-by: BuildkiteCI Reviewed-by: flokli <flokli@flokli.de>
This commit is contained in:
parent
23589a1db3
commit
70c4b512c2
1 changed files with 29 additions and 13 deletions
|
@ -1,4 +1,5 @@
|
||||||
use std::{path::PathBuf, rc::Rc};
|
use std::path::PathBuf;
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
use rustyline::{error::ReadlineError, Editor};
|
use rustyline::{error::ReadlineError, Editor};
|
||||||
use tvix_glue::tvix_store_io::TvixStoreIO;
|
use tvix_glue::tvix_store_io::TvixStoreIO;
|
||||||
|
@ -13,6 +14,22 @@ fn state_dir() -> Option<PathBuf> {
|
||||||
path
|
path
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
pub enum ReplCommand<'a> {
|
||||||
|
Expr(&'a str),
|
||||||
|
Explain(&'a str),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> ReplCommand<'a> {
|
||||||
|
pub fn parse(input: &'a str) -> Self {
|
||||||
|
if let Some(without_prefix) = input.strip_prefix(":d ") {
|
||||||
|
Self::Explain(without_prefix)
|
||||||
|
} else {
|
||||||
|
Self::Expr(input)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Repl {
|
pub struct Repl {
|
||||||
/// In-progress multiline input, when the input so far doesn't parse as a complete expression
|
/// In-progress multiline input, when the input so far doesn't parse as a complete expression
|
||||||
|
@ -69,24 +86,23 @@ impl Repl {
|
||||||
&line
|
&line
|
||||||
};
|
};
|
||||||
|
|
||||||
let res = if let Some(without_prefix) = input.strip_prefix(":d ") {
|
let res = match ReplCommand::parse(input) {
|
||||||
interpret(
|
ReplCommand::Expr(input) => interpret(
|
||||||
Rc::clone(&io_handle),
|
|
||||||
without_prefix,
|
|
||||||
None,
|
|
||||||
args,
|
|
||||||
true,
|
|
||||||
AllowIncomplete::Allow,
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
interpret(
|
|
||||||
Rc::clone(&io_handle),
|
Rc::clone(&io_handle),
|
||||||
input,
|
input,
|
||||||
None,
|
None,
|
||||||
args,
|
args,
|
||||||
false,
|
false,
|
||||||
AllowIncomplete::Allow,
|
AllowIncomplete::Allow,
|
||||||
)
|
),
|
||||||
|
ReplCommand::Explain(input) => interpret(
|
||||||
|
Rc::clone(&io_handle),
|
||||||
|
input,
|
||||||
|
None,
|
||||||
|
args,
|
||||||
|
true,
|
||||||
|
AllowIncomplete::Allow,
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
match res {
|
match res {
|
||||||
|
|
Loading…
Reference in a new issue