prebindgen-jni 0.5.0

JNI / Kotlin binding generator for prebindgen
Documentation
use kotlin_codegen::{KtFile, KtType};

use super::*;

fn render_as_raw(spec: IfaceSpec) -> String {
    KtFile::new(&spec.package)
        .decl(spec.to_as_raw_fun())
        .render()
}

#[test]
fn as_raw_adapter_is_multiline_even_when_short() {
    let spec = IfaceSpec {
        package: "io.test".to_string(),
        name: "ThingCallback".to_string(),
        type_params: vec![],
        params: vec![IfaceParam {
            name: "handle".to_string(),
            typed: KtType::cls("io.test.Thing"),
            raw: KtType::long(),
            wrap: WrapKind::Handle("io.test.Thing".to_string()),
        }],
        ret: KtType::unit(),
        descr: "(J)V".to_string(),
        typed_groups: Vec::new(),
        kdoc: None,
    };

    let src = render_as_raw(spec);
    assert!(
        src.contains(
            "public fun ThingCallback.asRaw(): ThingCallbackRaw =\n    \
                 ThingCallbackRaw {\n        \
                 handle ->\n        \
                 run(\n            \
                 Thing(handle)\n        \
                 )\n    \
                 }"
        ),
        "{src}"
    );
}

#[test]
fn as_raw_adapter_breaks_wide_lambda_params_and_run_args() {
    let spec = IfaceSpec {
        package: "io.test".to_string(),
        name: "ReplyCallback".to_string(),
        type_params: vec![],
        params: vec![
            IfaceParam {
                name: "replierZid".to_string(),
                typed: KtType::cls("io.test.ZenohId").nullable(),
                raw: KtType::long().nullable(),
                wrap: WrapKind::Handle("io.test.ZenohId".to_string()),
            },
            IfaceParam::same("replierEid".to_string(), KtType::int()),
            IfaceParam::same("isOk".to_string(), KtType::boolean()),
            IfaceParam {
                name: "sample__keyExpr".to_string(),
                typed: KtType::cls("io.test.KeyExpr").nullable(),
                raw: KtType::long().nullable(),
                wrap: WrapKind::Handle("io.test.KeyExpr".to_string()),
            },
            IfaceParam {
                name: "sample__payload".to_string(),
                typed: KtType::cls("io.test.ZBytes").nullable(),
                raw: KtType::long().nullable(),
                wrap: WrapKind::Handle("io.test.ZBytes".to_string()),
            },
        ],
        ret: KtType::unit(),
        descr: "(Ljava/lang/Long;IZLjava/lang/Long;Ljava/lang/Long;)V".to_string(),
        typed_groups: Vec::new(),
        kdoc: None,
    };

    let src = render_as_raw(spec);
    assert!(
        src.contains("public fun ReplyCallback.asRaw(): ReplyCallbackRaw =\n"),
        "{src}"
    );
    assert!(src.contains("    ReplyCallbackRaw {\n"), "{src}");
    assert!(src.contains("        replierZid,\n"), "{src}");
    assert!(src.contains("        sample__payload ->\n"), "{src}");
    assert!(src.contains("        run(\n"), "{src}");
    assert!(
        src.contains("            replierZid?.let { ZenohId(it) },\n"),
        "{src}"
    );
    assert!(
        src.contains("            sample__payload?.let { ZBytes(it) }\n"),
        "{src}"
    );
}