alef 0.109.6

Opinionated polyglot binding generator for Rust libraries
Documentation
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)"));
    }
}