use anyhow::Result;
use trusty_common::update::{check_crates_io, upgrade_and_restart, UpdateInfo};
pub async fn handle_upgrade(check_only: bool, yes: bool) -> Result<()> {
let crate_name = env!("CARGO_PKG_NAME");
let current = env!("CARGO_PKG_VERSION");
eprintln!("Checking for updates to {crate_name} (current: {current})…");
let info: Option<UpdateInfo> = check_crates_io(crate_name, current).await;
match info {
None => {
eprintln!("{crate_name} {current} is already up to date.");
}
Some(ref info) => {
eprintln!(
"Update available: {crate_name} {} (you have {})",
info.latest, info.current
);
}
}
if check_only {
return Ok(());
}
let Some(info) = info else {
return Ok(());
};
if !yes {
eprint!(
"Update {crate_name} {} → {}? [y/N] ",
info.current, info.latest
);
use std::io::Write as _;
let _ = std::io::stderr().flush();
let mut line = String::new();
std::io::stdin()
.read_line(&mut line)
.map_err(|e| anyhow::anyhow!("failed to read confirmation: {e}"))?;
let trimmed = line.trim().to_ascii_lowercase();
if trimmed != "y" && trimmed != "yes" {
eprintln!("Upgrade cancelled.");
return Ok(());
}
}
match upgrade_and_restart(crate_name, crate_name).await {
Ok(Some(hint)) => {
eprintln!("{hint}");
}
Ok(None) => {}
Err(e) => {
return Err(anyhow::anyhow!("upgrade failed: {e}"));
}
}
Ok(())
}