use crate::core::resolver::{
IResolver, alias::AliasResolver, exact::ExactMatchResolver, fallback::DefaultFallbackResolver,
truncation::TruncationResolver,
};
use crate::data::swap::IRegistryState;
use bistun_core::LmsError;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LocaleEntry {
pub id: String,
pub resolution_path: Vec<String>,
}
pub fn resolve(tag: &str, state: &dyn IRegistryState) -> Result<LocaleEntry, LmsError> {
let trimmed = tag.trim();
if trimmed.is_empty() {
return Err(LmsError::InvalidTag {
pipeline_step: "Phase 1: Taxonomic Resolution".to_string(),
tag: tag.to_string(),
reason: "Provided tag is empty or entirely whitespace".to_string(),
});
}
let mut exact_resolver = ExactMatchResolver::new();
let mut alias_resolver = AliasResolver::new();
let mut trunc_resolver = TruncationResolver::new();
let default_resolver = DefaultFallbackResolver::new();
trunc_resolver.set_next(Box::new(default_resolver));
alias_resolver.set_next(Box::new(trunc_resolver));
exact_resolver.set_next(Box::new(alias_resolver));
let mut resolution_path = Vec::with_capacity(4);
exact_resolver.resolve(trimmed, state, &mut resolution_path).ok_or_else(|| {
LmsError::ResolutionFailed {
pipeline_step: "Phase 1: Taxonomic Resolution".to_string(),
tag: trimmed.to_string(),
reason: "Fallback chain exhausted without hitting system default".to_string(),
}
})
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::resolver::test_utils::*;
#[test]
fn test_orchestrator_rejects_empty_tags() {
let mock_state = MockRegistryState::new();
let result = resolve(" ", &mock_state);
assert_eq!(
result,
Err(LmsError::InvalidTag {
pipeline_step: "Phase 1: Taxonomic Resolution".to_string(),
tag: " ".to_string(),
reason: "Provided tag is empty or entirely whitespace".to_string(),
})
);
}
#[test]
fn test_orchestrator_wires_chain_correctly() {
let mut mock_state = MockRegistryState::new();
mock_state
.expect_get_profile()
.with(mockall::predicate::eq("th-TH"))
.returning(|_| Some(create_stub("th-TH")));
let entry = resolve("th-TH", &mock_state)
.expect("LMS-TEST: Orchestrator failed to resolve valid tag");
assert_eq!(entry.id, "th-TH");
assert_eq!(entry.resolution_path.len(), 1);
}
}