use crate::core::aggregator::typology::aggregate;
use crate::core::extension::orthography;
use crate::core::resolver::orchestrator;
use crate::core::resource::resolver::resolve_resources;
use crate::core::synthesizer::rules::synthesize_rules;
use crate::data::swap::IRegistryState;
use crate::ops::telemetry;
use crate::validation::integrity;
use bistun_core::error::LmsError;
use bistun_core::manifest::CapabilityManifest;
use std::time::Instant;
use tracing::{debug, info, instrument};
#[instrument(level = "info", name = "pipeline_execution", skip(state), fields(tag = raw_tag))]
pub fn generate_manifest(
raw_tag: &str,
state: &dyn IRegistryState,
) -> Result<CapabilityManifest, LmsError> {
let start_time = Instant::now();
debug!("Commencing 5-Phase Pipeline for tag: {}", raw_tag);
let locale = orchestrator::resolve(raw_tag, state)?;
debug!("Resolved canonical ID: {}", locale.id);
let profile = state.get_profile(&locale.id).ok_or_else(|| LmsError::ResolutionFailed {
pipeline_step: "Phase 1: Taxonomic Resolution".to_string(),
tag: locale.id.clone(),
reason:
"Profile missing from active registry memory pool despite successful chain resolution"
.to_string(),
})?;
let mut manifest = CapabilityManifest::new(locale.id.clone());
aggregate(&mut manifest, &profile)?;
synthesize_rules(&mut manifest)?;
let base_uri = state.get_base_resource_uri();
resolve_resources(&mut manifest, &base_uri)?;
orthography::apply_extensions(&mut manifest, raw_tag)?;
integrity::verify(&manifest)?;
let version = state.get_version();
telemetry::record_metrics(&mut manifest, start_time, &locale.resolution_path, &version, false);
info!("Successfully generated manifest for {}", locale.id);
Ok(manifest)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::resolver::test_utils::{MockRegistryState, create_stub};
#[test]
fn test_dynamic_pipeline_resolution_and_telemetry() {
let mut mock_state = MockRegistryState::new();
mock_state.expect_resolve_alias().returning(|_| None);
mock_state.expect_get_version().returning(|| "v2.0.0-mock".to_string());
mock_state
.expect_get_base_resource_uri()
.returning(|| "https://cdn.bistun.io/".to_string());
mock_state
.expect_get_profile()
.returning(|id| if id == "ar-EG" { Some(create_stub("ar-EG")) } else { None });
let manifest = generate_manifest("ar-EG-u-ca-islamic", &mock_state)
.expect("LMS-TEST: Pipeline execution failed during hermetic test");
assert_eq!(manifest.resolved_locale, "ar-EG");
assert!(manifest.metadata.contains_key("resolution_time_ms"));
let calendar =
manifest.extensions.get("ca").expect("LMS-TEST: Missing expected extension 'ca'");
assert_eq!(calendar, "islamic");
}
}