use gitoid::GitOid;
use im::{HashSet, Vector};
#[derive(Clone, PartialOrd, Eq, Ord, Debug, Hash, PartialEq)]
pub struct GitBom {
git_oids: HashSet<GitOid>,
}
impl FromIterator<GitOid> for GitBom {
fn from_iter<T>(gitoids: T) -> Self
where
T: IntoIterator<Item = GitOid>,
{
let me = GitBom::new();
me.add_many(gitoids)
}
}
impl GitBom {
#[allow(clippy::new_without_default)]
pub fn new() -> Self {
Self {
git_oids: HashSet::new(),
}
}
pub fn new_from_iterator<I>(gitoids: I) -> Self
where
I: IntoIterator<Item = GitOid>,
{
let me = GitBom::new();
me.add_many(gitoids)
}
pub fn add(&self, gitoid: GitOid) -> Self {
self.add_many([gitoid])
}
pub fn add_many<I>(&self, gitoids: I) -> Self
where
I: IntoIterator<Item = GitOid>,
{
let mut updated = self.git_oids.clone(); for gitoid in gitoids {
updated = updated.update(gitoid);
}
Self { git_oids: updated }
}
pub fn get_oids(&self) -> HashSet<GitOid> {
self.git_oids.clone() }
pub fn get_sorted_oids(&self) -> Vector<GitOid> {
let mut ret = self.git_oids.clone().into_iter().collect::<Vector<_>>();
ret.sort();
ret
}
}
#[cfg(test)]
mod tests {
use gitoid::{GitOid, HashAlgorithm, ObjectType::Blob};
use im::vector;
use super::*;
#[test]
fn test_add() {
let oid = GitOid::new_from_str(HashAlgorithm::Sha256, Blob, "Hello");
assert_eq!(GitBom::new().add(oid).get_sorted_oids(), vector![oid])
}
#[test]
fn test_add_many() {
let mut oids: Vector<GitOid> = vec!["eee", "Hello", "Cat", "Dog"]
.into_iter()
.map(|s| GitOid::new_from_str(HashAlgorithm::Sha256, Blob, s))
.collect();
let da_bom = GitBom::new().add_many(oids.clone());
oids.sort();
assert_eq!(da_bom.get_sorted_oids(), oids);
}
#[test]
fn test_add_gitoid_to_gitbom() {
let input = "hello world".as_bytes();
let generated_gitoid = GitOid::new_from_bytes(HashAlgorithm::Sha256, Blob, input);
let new_gitbom = GitBom::new();
let new_gitbom = new_gitbom.add(generated_gitoid);
assert_eq!(
"fee53a18d32820613c0527aa79be5cb30173c823a9b448fa4817767cc84c6f03",
new_gitbom.get_sorted_oids()[0].hash().as_hex()
)
}
}