use std::collections::{HashMap, HashSet};
#[derive(Clone)]
pub struct Package {
pub name: String,
pub version: String,
pub candidate: Option<String>,
pub installed_size: u64,
pub description: String,
pub manual: bool,
pub install_epoch: Option<i64>,
pub install_date: Option<String>,
}
pub struct World {
pub packages: HashMap<String, Package>,
pub deps: HashMap<String, Vec<String>>,
pub rdeps: HashMap<String, Vec<String>>,
pub manual: HashSet<String>,
pub install_log: Vec<(i64, String)>,
}
impl World {
pub fn is_manual(&self, pkg: &str) -> bool {
self.manual.contains(pkg)
}
pub fn is_upgradable(&self, pkg: &str) -> bool {
self.packages
.get(pkg)
.map(|p| p.candidate.is_some())
.unwrap_or(false)
}
pub fn rdeps_of(&self, pkg: &str) -> &[String] {
self.rdeps.get(pkg).map(Vec::as_slice).unwrap_or(&[])
}
pub fn deps_of(&self, pkg: &str) -> &[String] {
self.deps.get(pkg).map(Vec::as_slice).unwrap_or(&[])
}
pub fn rdep_count(&self, pkg: &str) -> usize {
self.rdeps.get(pkg).map(Vec::len).unwrap_or(0)
}
pub fn all_names_sorted(&self) -> Vec<String> {
let mut names: Vec<String> = self.packages.keys().cloned().collect();
names.sort();
names
}
pub fn upgradable_names_sorted(&self) -> Vec<String> {
let mut names: Vec<String> = self
.packages
.values()
.filter(|p| p.candidate.is_some())
.map(|p| p.name.clone())
.collect();
names.sort();
names
}
}