diff options
author | lionel-rowe <lionel.rowe@gmail.com> | 2023-12-13 10:31:12 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-13 11:31:12 +0100 |
commit | 346d8127095f46bd5c58667f860521690ddd9cd7 (patch) | |
tree | 2099c0b1cbdee27f01fc69624870b4b35506b6c8 /runtime/ops/tty.rs | |
parent | 5a91a065b882215dde209baf626247e54c21a392 (diff) |
fix(runtime): Make native modal keyboard interaction consistent with browsers (#18453)
Fixes https://github.com/denoland/deno/issues/18223.
Fixes https://github.com/denoland/deno/issues/21477
---------
Co-authored-by: Bartek IwaĆczuk <biwanczuk@gmail.com>
Co-authored-by: David Sherret <dsherret@gmail.com>
Diffstat (limited to 'runtime/ops/tty.rs')
-rw-r--r-- | runtime/ops/tty.rs | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/runtime/ops/tty.rs b/runtime/ops/tty.rs index 477af9741..b0047eb85 100644 --- a/runtime/ops/tty.rs +++ b/runtime/ops/tty.rs @@ -5,6 +5,13 @@ use std::io::Error; use deno_core::error::AnyError; use deno_core::op2; use deno_core::OpState; +use rustyline::config::Configurer; +use rustyline::error::ReadlineError; +use rustyline::Cmd; +use rustyline::Editor; +use rustyline::KeyCode; +use rustyline::KeyEvent; +use rustyline::Modifiers; #[cfg(unix)] use deno_core::ResourceId; @@ -43,7 +50,12 @@ use winapi::um::wincon; deno_core::extension!( deno_tty, - ops = [op_stdin_set_raw, op_isatty, op_console_size], + ops = [ + op_stdin_set_raw, + op_isatty, + op_console_size, + op_read_line_prompt, + ], state = |state| { #[cfg(unix)] state.put(TtyModeStore::default()); @@ -320,3 +332,25 @@ mod tests { ); } } + +#[op2] +#[string] +pub fn op_read_line_prompt( + #[string] prompt_text: String, + #[string] default_value: String, +) -> Result<Option<String>, AnyError> { + let mut editor = Editor::<(), rustyline::history::DefaultHistory>::new() + .expect("Failed to create editor."); + + editor.set_keyseq_timeout(1); + editor + .bind_sequence(KeyEvent(KeyCode::Esc, Modifiers::empty()), Cmd::Interrupt); + + let read_result = + editor.readline_with_initial(&prompt_text, (&default_value, "")); + match read_result { + Ok(line) => Ok(Some(line)), + Err(ReadlineError::Interrupted | ReadlineError::Eof) => Ok(None), + Err(err) => Err(err.into()), + } +} |