use crate::{
Dependency,
supplychain::{License, Licenses},
};
#[derive(Debug, Clone, Default)]
pub struct Dependencies {
dependencies: Vec<Dependency>,
}
impl Iterator for Dependencies {
type Item = Dependency;
fn next(&mut self) -> Option<Self::Item> {
self.dependencies.pop()
}
}
impl Dependencies {
pub fn new() -> Self {
Self {
dependencies: Vec::new(),
}
}
pub fn push(&mut self, dependency: Dependency) {
self.dependencies.push(dependency);
}
pub fn extend(&mut self, dependencies: Vec<Dependency>) {
self.dependencies.extend(dependencies);
}
pub fn len(&self) -> usize {
self.dependencies.len()
}
pub fn is_empty(&self) -> bool {
self.dependencies.is_empty()
}
pub fn contains(&self, dependency: &Dependency) -> bool {
self.dependencies.contains(dependency)
}
pub fn find_by_name(&self, name: &str) -> Option<Dependency> {
self.dependencies.iter().find(|d| d.name == name).cloned()
}
pub fn find_by_names(&self, names: &[&str]) -> Vec<Dependency> {
self.dependencies
.iter()
.filter(|d| names.contains(&d.name.as_str()))
.cloned()
.collect()
}
pub fn find_by_license(&self, license: &License) -> Vec<Dependency> {
self.dependencies
.iter()
.filter(|d| d.licenses.contains(license))
.cloned()
.collect()
}
pub fn find_by_licenses(&self, licenses: &Licenses) -> Vec<Dependency> {
self.dependencies
.iter()
.filter(|d| {
d.licenses
.clone()
.into_iter()
.any(|l| licenses.contains(&l))
})
.cloned()
.collect()
}
}
#[cfg(test)]
mod tests {
use crate::{Dependencies, Dependency, supplychain::License};
#[test]
fn test_find_by_name() {
let mut deps = Dependencies::new();
deps.extend(vec![
Dependency::from("pkg:cargo/ghastoolkit-rs@0.2.0"),
Dependency::from("pkg:pip/ghastoolkit@0.12.0"),
]);
assert_eq!(deps.len(), 2);
let dep = deps
.find_by_name("ghastoolkit-rs")
.expect("Failed to find dependency by name");
assert_eq!(dep.name, "ghastoolkit-rs");
assert_eq!(dep.version, Some("0.2.0".to_string()));
}
#[test]
fn test_find_by_license() {
let mut deps = Dependencies::new();
deps.extend(vec![
Dependency::from(("pkg:cargo/ghastoolkit-rs@0.2.0", "MIT")),
Dependency::from(("pkg:pip/ghastoolkit@0.12.0", "Apache-2.0")),
]);
assert_eq!(deps.len(), 2);
let deps_license = deps.find_by_license(&License::MIT);
assert_eq!(deps_license.len(), 1);
let dep = deps_license
.first()
.expect("Failed to find dependency by license");
assert_eq!(dep.name, "ghastoolkit-rs");
assert_eq!(dep.manager, "cargo");
}
}