use crate::{registry::Registry, result::Result};
use std::cmp::Ordering;
use structopt::StructOpt;
const MAX_PACKAGE_NAME_LEN: usize = 50;
#[derive(Debug, StructOpt)]
pub enum List {
Source {
#[structopt(short, long)]
tag: Option<String>,
},
Tag {
#[structopt(short, long, default_value = "10")]
limit: usize,
},
}
fn cap(mut name: String) -> String {
name.push_str(&" ".repeat(MAX_PACKAGE_NAME_LEN - name.len()));
name
}
pub fn exec(registry: Registry, list: List) -> Result<()> {
match list {
List::Source { tag } => {
let mut should_checkout = false;
let mut source = registry.source()?;
source.sort_by(|(np, _), (nq, _)| np.partial_cmp(nq).unwrap_or(Ordering::Greater));
if let Some(tag) = tag {
if !tag.is_empty() {
should_checkout = true;
registry.checkout(&tag)?;
}
}
println!(
"{}",
source
.iter()
.map(|(name, ver)| { format!("{} - {}", cap(name.to_string()), ver) })
.collect::<Vec<_>>()
.join("\n")
);
if should_checkout {
registry.checkout("master")?;
}
}
List::Tag { limit } => {
let mut tags = registry.tag()?;
if tags.is_empty() {
registry.update()?;
}
let last = if limit < tags.len() || limit < 1 {
limit
} else {
tags.len()
};
tags.reverse();
println!("{}", &tags[..last].join("\n"));
}
}
Ok(())
}