use std::{ env, error::Error, fs::{self, OpenOptions}, io::Write, path::PathBuf, }; use gentoo_utils::{ atom::Atom, repo::{Repo, ebuild::Depend}, }; fn main() -> Result<(), Box> { let corpus_dir = PathBuf::from( env::args() .nth(1) .expect("expected corpus directory as first argument"), ); fs::create_dir_all(&corpus_dir)?; let repo = Repo::new("/var/db/repos/gentoo"); let mut atoms = Vec::new(); for category in repo.categories()? { for ebuild in category?.ebuilds()? { let depend = ebuild?.depend().to_vec(); for expr in depend { walk_expr(&mut atoms, &expr); } } } for (i, atom) in atoms.iter().enumerate() { let path = corpus_dir.as_path().join(i.to_string()); let mut file = OpenOptions::new() .write(true) .truncate(true) .create(true) .open(path)?; write!(file, "{atom}")?; } Ok(()) } fn walk_expr(atoms: &mut Vec, depend: &Depend) { match depend { Depend::Element(atom) => { atoms.push(atom.clone()); } Depend::AllOf(exprs) | Depend::OneOf(exprs) | Depend::AnyOf(exprs) | Depend::ConditionalGroup(_, exprs) => { for expr in exprs { walk_expr(atoms, expr); } } } }