summaryrefslogtreecommitdiff
path: root/runtime/permissions/prompter.rs
diff options
context:
space:
mode:
authorhaturau <135221985+haturatu@users.noreply.github.com>2024-11-20 01:20:47 +0900
committerGitHub <noreply@github.com>2024-11-20 01:20:47 +0900
commit85719a67e59c7aa45bead26e4942d7df8b1b42d4 (patch)
treeface0aecaac53e93ce2f23b53c48859bcf1a36ec /runtime/permissions/prompter.rs
parent67697bc2e4a62a9670699fd18ad0dd8efc5bd955 (diff)
parent186b52731c6bb326c4d32905c5e732d082e83465 (diff)
Merge branch 'denoland:main' into main
Diffstat (limited to 'runtime/permissions/prompter.rs')
-rw-r--r--runtime/permissions/prompter.rs81
1 files changed, 49 insertions, 32 deletions
diff --git a/runtime/permissions/prompter.rs b/runtime/permissions/prompter.rs
index e48e0af10..168a845a2 100644
--- a/runtime/permissions/prompter.rs
+++ b/runtime/permissions/prompter.rs
@@ -1,6 +1,5 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-use deno_core::error::AnyError;
use deno_core::parking_lot::Mutex;
use deno_terminal::colors;
use once_cell::sync::Lazy;
@@ -80,6 +79,10 @@ pub fn set_prompt_callbacks(
*MAYBE_AFTER_PROMPT_CALLBACK.lock() = Some(after_callback);
}
+pub fn set_prompter(prompter: Box<dyn PermissionPrompter>) {
+ *PERMISSION_PROMPTER.lock() = prompter;
+}
+
pub type PromptCallback = Box<dyn FnMut() + Send + Sync>;
pub trait PermissionPrompter: Send + Sync {
@@ -97,8 +100,7 @@ pub struct TtyPrompter;
fn clear_stdin(
_stdin_lock: &mut StdinLock,
_stderr_lock: &mut StderrLock,
-) -> Result<(), AnyError> {
- use deno_core::anyhow::bail;
+) -> Result<(), std::io::Error> {
use std::mem::MaybeUninit;
const STDIN_FD: i32 = 0;
@@ -113,7 +115,10 @@ fn clear_stdin(
loop {
let r = libc::tcflush(STDIN_FD, libc::TCIFLUSH);
if r != 0 {
- bail!("clear_stdin failed (tcflush)");
+ return Err(std::io::Error::new(
+ std::io::ErrorKind::Other,
+ "clear_stdin failed (tcflush)",
+ ));
}
// Initialize timeout for select to be 100ms
@@ -133,7 +138,10 @@ fn clear_stdin(
// Check if select returned an error
if r < 0 {
- bail!("clear_stdin failed (select)");
+ return Err(std::io::Error::new(
+ std::io::ErrorKind::Other,
+ "clear_stdin failed (select)",
+ ));
}
// Check if select returned due to timeout (stdin is quiescent)
@@ -152,8 +160,7 @@ fn clear_stdin(
fn clear_stdin(
stdin_lock: &mut StdinLock,
stderr_lock: &mut StderrLock,
-) -> Result<(), AnyError> {
- use deno_core::anyhow::bail;
+) -> Result<(), std::io::Error> {
use winapi::shared::minwindef::TRUE;
use winapi::shared::minwindef::UINT;
use winapi::shared::minwindef::WORD;
@@ -190,18 +197,23 @@ fn clear_stdin(
return Ok(());
- unsafe fn flush_input_buffer(stdin: HANDLE) -> Result<(), AnyError> {
+ unsafe fn flush_input_buffer(stdin: HANDLE) -> Result<(), std::io::Error> {
let success = FlushConsoleInputBuffer(stdin);
if success != TRUE {
- bail!(
- "Could not flush the console input buffer: {}",
- std::io::Error::last_os_error()
- )
+ return Err(std::io::Error::new(
+ std::io::ErrorKind::Other,
+ format!(
+ "Could not flush the console input buffer: {}",
+ std::io::Error::last_os_error()
+ ),
+ ));
}
Ok(())
}
- unsafe fn emulate_enter_key_press(stdin: HANDLE) -> Result<(), AnyError> {
+ unsafe fn emulate_enter_key_press(
+ stdin: HANDLE,
+ ) -> Result<(), std::io::Error> {
// https://github.com/libuv/libuv/blob/a39009a5a9252a566ca0704d02df8dabc4ce328f/src/win/tty.c#L1121-L1131
let mut input_record: INPUT_RECORD = std::mem::zeroed();
input_record.EventType = KEY_EVENT;
@@ -216,34 +228,43 @@ fn clear_stdin(
let success =
WriteConsoleInputW(stdin, &input_record, 1, &mut record_written);
if success != TRUE {
- bail!(
- "Could not emulate enter key press: {}",
- std::io::Error::last_os_error()
- );
+ return Err(std::io::Error::new(
+ std::io::ErrorKind::Other,
+ format!(
+ "Could not emulate enter key press: {}",
+ std::io::Error::last_os_error()
+ ),
+ ));
}
Ok(())
}
- unsafe fn is_input_buffer_empty(stdin: HANDLE) -> Result<bool, AnyError> {
+ unsafe fn is_input_buffer_empty(
+ stdin: HANDLE,
+ ) -> Result<bool, std::io::Error> {
let mut buffer = Vec::with_capacity(1);
let mut events_read = 0;
let success =
PeekConsoleInputW(stdin, buffer.as_mut_ptr(), 1, &mut events_read);
if success != TRUE {
- bail!(
- "Could not peek the console input buffer: {}",
- std::io::Error::last_os_error()
- )
+ return Err(std::io::Error::new(
+ std::io::ErrorKind::Other,
+ format!(
+ "Could not peek the console input buffer: {}",
+ std::io::Error::last_os_error()
+ ),
+ ));
}
Ok(events_read == 0)
}
- fn move_cursor_up(stderr_lock: &mut StderrLock) -> Result<(), AnyError> {
- write!(stderr_lock, "\x1B[1A")?;
- Ok(())
+ fn move_cursor_up(
+ stderr_lock: &mut StderrLock,
+ ) -> Result<(), std::io::Error> {
+ write!(stderr_lock, "\x1B[1A")
}
- fn read_stdin_line(stdin_lock: &mut StdinLock) -> Result<(), AnyError> {
+ fn read_stdin_line(stdin_lock: &mut StdinLock) -> Result<(), std::io::Error> {
let mut input = String::new();
stdin_lock.read_line(&mut input)?;
Ok(())
@@ -265,7 +286,7 @@ fn get_stdin_metadata() -> std::io::Result<std::fs::Metadata> {
unsafe {
let stdin = std::fs::File::from_raw_fd(0);
let metadata = stdin.metadata().unwrap();
- stdin.into_raw_fd();
+ let _ = stdin.into_raw_fd();
Ok(metadata)
}
}
@@ -366,7 +387,7 @@ impl PermissionPrompter for TtyPrompter {
let mut input = String::new();
let result = stdin_lock.read_line(&mut input);
- let input = input.trim_end_matches(|c| c == '\r' || c == '\n');
+ let input = input.trim_end_matches(['\r', '\n']);
if result.is_err() || input.len() != 1 {
break PromptResponse::Deny;
};
@@ -476,8 +497,4 @@ pub mod tests {
STUB_PROMPT_VALUE.store(value, Ordering::SeqCst);
}
}
-
- pub fn set_prompter(prompter: Box<dyn PermissionPrompter>) {
- *PERMISSION_PROMPTER.lock() = prompter;
- }
}