use std::io;
use std::path::PathBuf;
use crate::cache_pair::CachePair;
use crate::package::package::Package;
pub struct PackageCollection<T: CachePair> {
directory: PathBuf,
is_post_ensmallening: bool,
packages: Vec<Package<T>>,
}
impl<T: CachePair> PackageCollection<T> {
pub fn new<P>(directory: P, is_post_ensmallening: bool) -> Result<Self, io::Error>
where
P: Into<PathBuf>,
{
let directory = directory.into();
let mut packages = Vec::new();
for entry in std::fs::read_dir(&directory).unwrap() {
let entry = entry?;
let file_name = entry.file_name().into_string().unwrap();
if file_name.len() < 7 {
continue;
}
if !file_name.starts_with("H.") || !file_name.ends_with(".toc") {
continue;
}
let package_name = file_name[2..file_name.len() - 4].to_string();
let package = Package::<T>::new(&directory, package_name, is_post_ensmallening);
packages.push(package);
}
Ok(Self {
directory,
is_post_ensmallening,
packages,
})
}
pub fn is_post_ensmallening(&self) -> bool {
self.is_post_ensmallening
}
pub fn borrow(&self, package_name: &str) -> Option<&Package<T>> {
self.packages
.iter()
.find(|package| package.name() == package_name)
}
pub fn borrow_mut(&mut self, package_name: &str) -> Option<&mut Package<T>> {
self.packages
.iter_mut()
.find(|package| package.name() == package_name)
}
pub fn take(&mut self, package_name: &str) -> Option<Package<T>> {
let index = self
.packages
.iter()
.position(|package| package.name() == package_name)?;
Some(self.packages.remove(index))
}
pub fn directory(&self) -> &PathBuf {
&self.directory
}
pub fn packages(&self) -> &Vec<Package<T>> {
&self.packages
}
}