use bistun_core::error::LmsError;
use bistun_core::manifest::{CapabilityManifest, TraitValue};
use bistun_core::traits::TraitKey;
pub fn resolve_resources(
manifest: &mut CapabilityManifest,
base_uri: &str,
) -> Result<(), LmsError> {
if let Some(TraitValue::String(resource_id)) = manifest.traits.get(&TraitKey::ResourceId) {
let formatted_base =
if base_uri.ends_with('/') { base_uri.to_string() } else { format!("{}/", base_uri) };
let resolved_uri = format!("{}{}.dat", formatted_base, resource_id);
manifest.metadata.insert("resource_uri".to_string(), resolved_uri);
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use bistun_core::traits::Direction;
#[test]
fn test_resolver_injects_uri_when_resource_id_present() {
let mut manifest = CapabilityManifest::new("th-TH".to_string());
manifest.traits.insert(TraitKey::ResourceId, TraitValue::String("tri_thai".to_string()));
let base_uri = "https://cdn.example.com/assets/";
assert!(resolve_resources(&mut manifest, base_uri).is_ok());
assert_eq!(
manifest.metadata.get("resource_uri").unwrap(),
"https://cdn.example.com/assets/tri_thai.dat"
);
}
#[test]
fn test_resolver_handles_missing_trailing_slash() {
let mut manifest = CapabilityManifest::new("ar-EG".to_string());
manifest.traits.insert(TraitKey::ResourceId, TraitValue::String("icu_arab".to_string()));
let base_uri = "https://cdn.example.com/assets"; assert!(resolve_resources(&mut manifest, base_uri).is_ok());
assert_eq!(
manifest.metadata.get("resource_uri").unwrap(),
"https://cdn.example.com/assets/icu_arab.dat"
);
}
#[test]
fn test_resolver_skips_when_no_resource_id_required() {
let mut manifest = CapabilityManifest::new("en-US".to_string());
manifest.traits.insert(TraitKey::PrimaryDirection, TraitValue::Direction(Direction::LTR));
let base_uri = "https://cdn.example.com/assets/";
assert!(resolve_resources(&mut manifest, base_uri).is_ok());
assert!(manifest.metadata.get("resource_uri").is_none());
}
}