use ctx::error::Result;
use ctx::exit::Outcome;
use ctx::update;
pub fn run_self_update(version: Option<&str>, json: bool) -> Result<Outcome> {
let report = update::self_update(version)?;
if json {
ctx::json::emit(
"self_update",
serde_json::json!({
"old_version": report.old_version.to_string(),
"new_version": report.new_version.to_string(),
"outcome": if report.updated { "updated" } else { "up_to_date" },
}),
)?;
} else if report.updated {
println!("ctx {} → {}", report.old_version, report.new_version);
} else {
println!("ctx {} is already up to date", report.old_version);
}
Ok(Outcome::Clean)
}
pub fn run_version(check: bool, json: bool) -> Result<Outcome> {
if !check {
println!("ctx {}", env!("CARGO_PKG_VERSION"));
return Ok(Outcome::Clean);
}
let (current, latest) = update::explicit_check()?;
if json {
ctx::json::emit(
"version.check",
serde_json::json!({
"current_version": current.to_string(),
"latest_version": latest.to_string(),
"update_available": latest > current,
}),
)?;
} else if latest > current {
println!("{}", update::update_notice(&latest, ¤t));
} else {
println!("ctx {current} is up to date");
}
Ok(Outcome::Clean)
}