use crate::{
api::ApiError,
domain::{
CodeIndexCheckpoint, CodeIndexTaskRecord, CodeRepositoryRegistration, CodeRepositoryStatus,
},
storage::{CodeIndexPublicationStore, RepositoryCatalogStore},
};
use super::super::errors::storage_api_error;
pub(in crate::application::code_repository) async fn required_code_repository(
store: &(impl RepositoryCatalogStore + ?Sized),
repository: &str,
) -> Result<crate::domain::CodeRepositoryStatus, ApiError> {
store
.code_repository_status(repository.to_owned())
.await
.map_err(storage_api_error)?
.ok_or_else(|| {
ApiError::invalid_argument(format!("code repository '{repository}' is not registered"))
})
}
pub(in crate::application::code_repository) async fn code_status_checkpoint(
store: &(impl CodeIndexPublicationStore + ?Sized),
status: &CodeRepositoryStatus,
active_task: Option<&CodeIndexTaskRecord>,
) -> Result<Option<CodeIndexCheckpoint>, ApiError> {
if let Some(task) = active_task {
return store
.code_index_checkpoint(task.source_scope.clone())
.await
.map_err(storage_api_error);
}
if status.state == "indexing"
&& let Some(checkpoint) = store
.latest_code_index_checkpoint(status.repository_id.clone())
.await
.map_err(storage_api_error)?
{
return Ok(Some(checkpoint));
}
if let Some(scope) = status.last_indexed_scope_id.clone()
&& let Some(checkpoint) = store
.code_index_checkpoint(scope)
.await
.map_err(storage_api_error)?
{
return Ok(Some(checkpoint));
}
Ok(None)
}
pub(in crate::application::code_repository) fn registration_from_status(
status: &crate::domain::CodeRepositoryStatus,
) -> CodeRepositoryRegistration {
CodeRepositoryRegistration {
repository_id: status.repository_id.clone(),
alias: status.alias.clone(),
root_path: status.root_path.clone(),
path_filters: status.path_filters.clone(),
language_filters: status.language_filters.clone(),
}
}