use std::env::home_dir;
use std::path::PathBuf;
use anyhow::Result;
use crate::CodeQLPack;
#[derive(Debug, Clone, Default)]
pub struct CodeQLPacks {
packs: Vec<CodeQLPack>,
}
impl CodeQLPacks {
pub fn len(&self) -> usize {
self.packs.len()
}
pub fn sort(&mut self) {
self.packs.sort_by(|a, b| a.pack_type().cmp(&b.pack_type()));
}
pub fn packs(&self) -> &[CodeQLPack] {
&self.packs
}
pub fn merge(&mut self, other: &mut Self) {
self.packs.append(&mut other.packs);
}
pub(crate) fn codeql_packages_path() -> PathBuf {
let homedir = home_dir()
.unwrap_or_else(|| PathBuf::from("."))
.canonicalize()
.unwrap_or_else(|_| PathBuf::from("."));
homedir.join(".codeql").join("packages")
}
pub fn load(path: impl Into<PathBuf>) -> Result<Self> {
let path: PathBuf = path.into();
let mut packs = Vec::new();
for entry in walkdir::WalkDir::new(&path) {
let entry = entry?;
if entry.path().to_str().unwrap().contains(".codeql") {
continue;
}
if entry.file_name() == "qlpack.yml" {
let pack = CodeQLPack::new(entry.path().display().to_string());
packs.push(pack);
}
}
Ok(Self { packs })
}
}
impl IntoIterator for CodeQLPacks {
type Item = CodeQLPack;
type IntoIter = std::vec::IntoIter<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
self.packs.into_iter()
}
}
impl Extend<CodeQLPack> for CodeQLPacks {
fn extend<T: IntoIterator<Item = CodeQLPack>>(&mut self, iter: T) {
self.packs.extend(iter);
}
}