use super::{
index_registered_repo, open_store, validate_repo_name, AsrError, AsrResult, RepoIndexAllOutput,
RepoIndexFailure, RepoIndexOutput,
};
pub(crate) fn repo_index(name: &str) -> AsrResult<RepoIndexOutput> {
validate_repo_name(name)?;
let (paths, store) = open_store()?;
let repo = super::require_repo(&store, name)?;
index_registered_repo(&paths, &store, &repo)
}
pub(crate) fn repo_index_all() -> AsrResult<RepoIndexAllOutput> {
let (paths, store) = open_store()?;
let repos = store.list_repos()?;
if repos.is_empty() {
return Err(AsrError::new(
"no_repos_registered",
"No repositories are registered",
));
}
let mut indexed = Vec::new();
let mut failures = Vec::new();
for repo in repos {
match index_registered_repo(&paths, &store, &repo) {
Ok(output) => indexed.push(output),
Err(err) => failures.push(RepoIndexFailure {
repo: repo.name,
code: err.code.to_string(),
message: err.message,
path: err.path,
}),
}
}
indexed.sort_by(|a, b| a.repo.cmp(&b.repo));
failures.sort_by(|a, b| a.repo.cmp(&b.repo));
Ok(RepoIndexAllOutput {
ok: failures.is_empty(),
indexed,
failures,
})
}