Skip to main content

relay_knowledge/code/registration/
mod.rs

1//! Validates and resolves code-repository registration inputs.
2
3use 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
14/// Validates a code source root and creates a stable repository registration.
15pub 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}