ito_core/
backend_module_repository.rs1use 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
12pub struct BackendModuleRepository<R: BackendModuleReader> {
17 reader: R,
18}
19
20impl<R: BackendModuleReader> BackendModuleRepository<R> {
21 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}