use crate::core::config::ResolvedCrateConfig;
pub(super) fn generate(config: &ResolvedCrateConfig) -> Option<String> {
if config.components.is_empty() {
return None;
}
let mut generated = crate::backends::swift::template_env::render("components.swift.jinja", crate::alef_context! {});
generated.push('\n');
Some(generated)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::config::{ComponentConfig, ComponentProvidesConfig};
#[test]
fn emits_public_swift_api_with_explicit_mobile_exclusion() {
let config = ResolvedCrateConfig {
components: vec![ComponentConfig {
name: "fast".into(),
provides: vec![ComponentProvidesConfig {
contract: "engine".into(),
implementation: "demo_core::FastEngine".into(),
}],
features: vec!["fast".into()],
default_features: false,
targets: Some(vec!["aarch64-apple-darwin".into()]),
bundled_on: Vec::new(),
}],
..ResolvedCrateConfig::default()
};
let generated = generate(&config).expect("component API");
assert!(generated.contains("public func componentLoad"));
assert!(generated.contains("public func componentPrefetch"));
assert!(generated.contains("public func componentStatus"));
assert!(generated.contains("public func componentCachePath"));
assert!(generated.contains("#if os(iOS) || os(tvOS)"));
assert!(generated.contains("RustBridge.component_load"));
assert!(generated.contains("AlefComponentResponse<Value>"));
use sha2::Digest as _;
assert_eq!(
sha2::Sha256::digest(generated.as_bytes())
.iter()
.map(|byte| format!("{byte:02x}"))
.collect::<String>(),
"b053585558b16dddab0945981fb60d4d9914414439b53ad55af2cdffd52f8407"
);
}
}