relay_knowledge/code/registration/
mod.rs1use std::path::Path;
4
5use crate::domain::CodeRepositoryRegistration;
6
7use super::{CodeIndexError, source::registration_source};
8
9pub(crate) const REGISTRATION_LANGUAGE_FILTER_ERROR: &str = concat!(
10 "registration language filters are not supported; ",
11 "register the full language surface and use query-time --language filters to narrow results"
12);
13
14pub fn register_repository(
16 path: impl AsRef<Path>,
17 alias: impl Into<String>,
18 path_filters: Vec<String>,
19 language_filters: Vec<String>,
20) -> Result<CodeRepositoryRegistration, CodeIndexError> {
21 if !language_filters.is_empty() {
22 return Err(CodeIndexError::InvalidInput(
23 REGISTRATION_LANGUAGE_FILTER_ERROR.to_owned(),
24 ));
25 }
26 let source = registration_source(path.as_ref())?;
27 let root_identity = source.root.display().to_string();
28 let repository_id = source.identity;
29 let alias = explicit_or_project_alias(alias, &source.root)?;
30
31 CodeRepositoryRegistration::new(
32 repository_id,
33 alias,
34 root_identity,
35 path_filters,
36 language_filters,
37 )
38 .map_err(|error| CodeIndexError::InvalidInput(error.to_string()))
39}
40
41fn explicit_or_project_alias(
42 alias: impl Into<String>,
43 root: &Path,
44) -> Result<String, CodeIndexError> {
45 let alias = alias.into();
46 if !alias.trim().is_empty() {
47 return Ok(alias);
48 }
49
50 root.file_name()
51 .and_then(|name| name.to_str())
52 .map(str::trim)
53 .filter(|name| !name.is_empty())
54 .map(ToOwned::to_owned)
55 .ok_or_else(|| {
56 CodeIndexError::InvalidInput(
57 "repository alias is empty and Git root has no project directory name".to_owned(),
58 )
59 })
60}