Skip to main content

ito_core/
backend_module_repository.rs

1//! Backend-backed module repository adapter.
2//!
3//! Delegates module reads to a [`BackendModuleReader`] when backend mode is
4//! enabled. The filesystem repository remains the fallback when backend mode
5//! is disabled.
6
7use ito_common::id::parse_module_id as parse_common_module_id;
8use ito_domain::backend::BackendModuleReader;
9use ito_domain::errors::{DomainError, DomainResult};
10use ito_domain::modules::{Module, ModuleRepository as DomainModuleRepository, ModuleSummary};
11
12/// Backend-backed module repository.
13///
14/// Wraps a [`BackendModuleReader`] implementation and delegates module reads
15/// to the backend API.
16pub struct BackendModuleRepository<R: BackendModuleReader> {
17    reader: R,
18}
19
20impl<R: BackendModuleReader> BackendModuleRepository<R> {
21    /// Create a backend-backed module repository.
22    pub fn new(reader: R) -> Self {
23        Self { reader }
24    }
25}
26
27impl<R: BackendModuleReader> DomainModuleRepository for BackendModuleRepository<R> {
28    fn exists(&self, id: &str) -> bool {
29        let module_id = resolve_backend_module_key(id);
30        match self.reader.get_module(&module_id) {
31            Ok(_) => true,
32            Err(DomainError::NotFound { .. }) => false,
33            Err(err) => {
34                tracing::warn!("backend module exists check failed: {err}");
35                true
36            }
37        }
38    }
39
40    fn get(&self, id_or_name: &str) -> DomainResult<Module> {
41        let module_id = resolve_backend_module_key(id_or_name);
42        match self.reader.get_module(&module_id) {
43            Ok(module) => Ok(module),
44            Err(DomainError::NotFound { .. }) => Err(DomainError::not_found("module", id_or_name)),
45            Err(err) => Err(err),
46        }
47    }
48
49    fn list(&self) -> DomainResult<Vec<ModuleSummary>> {
50        let mut modules = self.reader.list_modules()?;
51        modules.sort_by(|a, b| a.id.cmp(&b.id));
52        Ok(modules)
53    }
54}
55
56fn resolve_backend_module_key(id_or_name: &str) -> String {
57    if let Ok(parsed) = parse_common_module_id(id_or_name) {
58        return parsed.module_id.as_str().to_string();
59    }
60
61    id_or_name.to_string()
62}