use crate::core::backend::GeneratedFile;
use crate::core::config::ResolvedCrateConfig;
use std::path::PathBuf;
pub(super) fn generate_panama(config: &ResolvedCrateConfig, package: &str) -> GeneratedFile {
let java_package = config.java_package();
let content = format!(
r#"// Generated by alef. Do not edit by hand.
package {package}
import {java_package}.Components as JavaComponents
/** Verified downloadable native-component management. */
object Components {{
/** Downloads, verifies, loads, and pins a configured component. */
@JvmStatic
fun componentLoad(component: String) = JavaComponents.componentLoad(component)
/** Downloads and verifies every configured component. */
@JvmStatic
fun componentPrefetch(): List<String> = JavaComponents.componentPrefetch()
/** Downloads and verifies one configured component. */
@JvmStatic
fun componentPrefetch(component: String): List<String> = JavaComponents.componentPrefetch(component)
/** Returns ready, cached, not_downloaded, bundled, or unsupported:<reason>. */
@JvmStatic
fun componentStatus(component: String): String = JavaComponents.componentStatus(component)
/** Returns the content-addressed cache path for a configured component. */
@JvmStatic
fun componentCachePath(component: String): String = JavaComponents.componentCachePath(component)
}}
"#,
);
GeneratedFile {
path: output_path(config, package),
content,
generated_header: true,
}
}
fn output_path(config: &ResolvedCrateConfig, package: &str) -> PathBuf {
let root = config
.output_for("kotlin")
.map(|path| path.to_path_buf())
.unwrap_or_else(|| PathBuf::from("packages/kotlin"));
if config.explicit_output.kotlin.is_some() {
root.join("Components.kt")
} else {
root.join("src/main/kotlin")
.join(package.replace('.', "/"))
.join("Components.kt")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn emits_kotlin_facade_over_java_component_manager() {
let config = ResolvedCrateConfig {
name: "demo-core".into(),
..ResolvedCrateConfig::default()
};
let generated = generate_panama(&config, "dev.demo.kt");
assert!(generated.content.contains(".Components as JavaComponents"));
assert!(generated.content.contains("fun componentLoad(component: String)"));
assert!(generated.content.contains("fun componentPrefetch(): List<String>"));
assert!(generated.content.contains("fun componentStatus(component: String)"));
}
}