use std::collections::HashMap;
use rustdoc_types::Crate;
#[derive(Debug, Default)]
pub struct CrateCollection {
crates: HashMap<String, Crate>,
}
impl CrateCollection {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn insert(&mut self, name: String, krate: Crate) -> Option<Crate> {
self.crates.insert(name, krate)
}
#[must_use]
pub fn get(&self, name: &str) -> Option<&Crate> {
self.crates.get(name)
}
#[must_use]
pub fn get_with_name(&self, name: &str) -> Option<(&str, &Crate)> {
self.crates
.get_key_value(name)
.map(|(k, v)| (k.as_str(), v))
}
#[must_use]
pub fn contains(&self, name: &str) -> bool {
self.crates.contains_key(name)
}
pub fn iter(&self) -> impl Iterator<Item = (&String, &Crate)> {
let mut entries: Vec<_> = self.crates.iter().collect();
entries.sort_by_key(|(name, _)| *name);
entries.into_iter()
}
#[must_use]
pub fn len(&self) -> usize {
self.crates.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.crates.is_empty()
}
#[must_use]
pub fn names(&self) -> Vec<&String> {
let mut names: Vec<_> = self.crates.keys().collect();
names.sort();
names
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_insert_and_get() {
let collection = CrateCollection::new();
assert!(collection.is_empty());
assert_eq!(collection.len(), 0);
}
#[test]
fn test_names_returns_sorted() {
let collection = CrateCollection::new();
let names = collection.names();
let mut sorted = names.clone();
sorted.sort();
assert_eq!(names, sorted);
}
}