pub fn list_releases(args: &Vec<Rc<str>>, cvm_home: &Path) -> Result<(), Rc<str>> {
let releases = cached_releases(cvm_home)?;
let current = current_version(cvm_home).unwrap_or(Rc::from(""));
let installed = installed(cvm_home).unwrap_or(Vec::new());
if args.len() == 2 {
println!("Currently available releases (last 10):");
for i in 0..10 {
print_release(&releases[i], ¤t, &installed);
}
return Ok(());
}
if args.len() >= 3 && args[2].as_ref() != "--all" && args[2].as_ref() != "-a" {
return Err(INVALID_ARGS_STR.into());
}
for release in releases {
print_release(&release, ¤t, &installed);
}
Ok(())
}
fn print_release(release: &str, current: &str, installed: &Vec<Rc<str>>) {
let is_installed = is_installed(release, installed);
let text = if release == current && is_installed {
"(installed | selected)"
} else if is_installed {
"(installed)"
} else {
""
};
AnsiBuilder::new()
.text(&format!(" {} ", release))
.color()
.fg()
.green()
.text(text)
.reset_attributes()
.println();
}
const INVALID_ARGS_STR: &'static str =
"Option 'list' must have expected optional flags: --all or -a";
use std::path::Path;
use std::rc::Rc;
use ansi_builder::AnsiBuilder;
use crate::releases::{cached_releases, current_version, installed, is_installed};