use std::{cmp::Ordering, time::Duration};
use comfy_table::{Attribute, Cell, Color};
use crates_io_api::SyncClient;
use semver::Version;
#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum VersionCheck {
NewerAvailable(Version),
UpToDate,
LocalNewer,
#[default]
UnAvailable,
}
impl VersionCheck {
pub fn colored_cell(&self) -> Cell {
match self {
Self::LocalNewer => Cell::new("No Update").add_attribute(Attribute::Dim),
Self::NewerAvailable(version) => Cell::new(format!("Update Available ({version})"))
.fg(Color::Green)
.add_attribute(Attribute::Bold),
Self::UnAvailable => Cell::new("Not Available").fg(Color::Red),
Self::UpToDate => Cell::new("Up to date").fg(Color::Blue),
}
}
}
pub struct PackageInfo {
pub name: String,
pub version: Version,
pub info: VersionCheck,
}
impl PackageInfo {
pub fn new(name: String, version: Version) -> Self {
Self {
name,
version,
info: VersionCheck::default(),
}
}
pub fn set_info(&mut self, latest: &Version) {
self.info = match self.version.cmp(latest) {
Ordering::Less => VersionCheck::NewerAvailable(latest.clone()),
Ordering::Greater => VersionCheck::LocalNewer,
Ordering::Equal => VersionCheck::UpToDate,
}
}
pub fn latest_version(&self) -> anyhow::Result<Version> {
let client = SyncClient::new("cargo-binlist", Duration::from_millis(1000))?;
log::debug!("Fetching latest version for {}", self.name);
let cr = client.get_crate(&self.name)?;
let version = Version::parse(&cr.crate_data.max_version)?;
Ok(version)
}
}