use std::io::IsTerminal as _;
use std::io::Write as _;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ConfirmResult {
Accepted,
Declined,
Discarded,
}
pub fn confirm_prompt(prompt: &str, confirm_before_prompt: bool) -> ConfirmResult {
if !confirm_before_prompt {
return ConfirmResult::Accepted;
}
if !std::io::stdin().is_terminal() {
tracing::warn!(
"deep-link: prompt discarded — no TTY available (INV-NOTTY); starting blank session"
);
return ConfirmResult::Discarded;
}
println!("Deep-link prompt:\n---\n{prompt}\n---");
print!("Accept? [y/N] ");
let _ = std::io::stdout().flush();
let mut input = String::new();
match std::io::stdin().read_line(&mut input) {
Ok(_) => {
if input.trim().eq_ignore_ascii_case("y") {
ConfirmResult::Accepted
} else {
ConfirmResult::Declined
}
}
Err(e) => {
tracing::warn!("deep-link: failed to read confirmation input: {e}; discarding prompt");
ConfirmResult::Discarded
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn confirm_prompt_accepted_when_confirm_disabled() {
let result = confirm_prompt("test prompt", false);
assert_eq!(result, ConfirmResult::Accepted);
}
#[test]
fn confirm_prompt_discarded_when_no_tty_and_confirm_enabled() {
if std::io::stdin().is_terminal() {
return; }
let result = confirm_prompt("test prompt", true);
assert_eq!(result, ConfirmResult::Discarded);
}
}