use super::*;
use crate::cli::helpers::updater::Updater;
#[derive(Debug, Parser)]
pub struct LeoUpdate {
#[clap(short = 'l', long, help = "List all available releases.")]
list: bool,
#[clap(short = 'n', long, help = "An optional release name.")]
name: Option<String>,
#[clap(short = 'q', long, help = "Suppress download logs.")]
quiet: bool,
}
impl Command for LeoUpdate {
type Input = ();
type Output = ();
fn log_span(&self) -> Span {
tracing::span!(tracing::Level::INFO, "Leo")
}
fn prelude(&self, _: Context) -> Result<Self::Input> {
Ok(())
}
fn apply(self, _: Context, _: Self::Input) -> Result<Self::Output>
where
Self: Sized,
{
match self.list {
true => match Updater::show_available_releases() {
Ok(output) => tracing::info!("{output}"),
Err(error) => tracing::info!("Failed to list the available versions of Leo\n{error}\n"),
},
false => {
let show_output = !self.quiet;
let result = Updater::update(show_output, self.name.clone());
if show_output {
match &result {
Ok(status) => {
if status.uptodate() {
tracing::info!("\nLeo is already on the latest version")
} else if status.updated() {
tracing::info!("\nLeo has updated to version {}", status.version())
}
}
Err(e) => tracing::info!("\nFailed to update Leo to the latest version\n{e}\n"),
}
}
if result.is_ok() {
Updater::update_bundled_plugins(show_output, self.name.as_deref());
}
}
}
Ok(())
}
}