boltffi_bindgen 0.24.1

Code generation library for BoltFFI - generates Swift, Kotlin, and TypeScript bindings
Documentation
public final class {{ module.class_name }} {
    private {{ module.class_name }}() {}
{%- for func in module.functions %}
{%- if func.is_async() %}
{%- match func.async_call %}
{%- when Some with (ac) %}
{% if module.async_mode.is_virtual_thread() %}
{%- if ac.complete_return_plan.is_void() %}
{{ self::javadoc_block(func.doc, "    ") }}    public static void {{ func.name }}({% for param in func.params %}{{ param.java_type }} {{ param.name }}{% if !loop.last %}, {% endif %}{% endfor %}) {
        BoltFFIAsync.callAsyncVoid(
{%- else %}
{{ self::javadoc_block(func.doc, "    ") }}    public static {{ func.return_type }} {{ func.name }}({% for param in func.params %}{{ param.java_type }} {{ param.name }}{% if !loop.last %}, {% endif %}{% endfor %}) {
        return BoltFFIAsync.callAsync(
{%- endif %}
{%- else %}
{%- if ac.complete_return_plan.is_void() %}
{{ self::javadoc_block(func.doc, "    ") }}    public static CompletableFuture<Void> {{ func.name }}({% for param in func.params %}{{ param.java_type }} {{ param.name }}{% if !loop.last %}, {% endif %}{% endfor %}) {
        return BoltFFIAsync.callAsyncVoid(
{%- else %}
{{ self::javadoc_block(func.doc, "    ") }}    public static CompletableFuture<{{ func.boxed_return_type() }}> {{ func.name }}({% for param in func.params %}{{ param.java_type }} {{ param.name }}{% if !loop.last %}, {% endif %}{% endfor %}) {
        return BoltFFIAsync.callAsync(
{%- endif %}
{%- endif %}
{%- if func.input_bindings.is_empty() %}
                () -> Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %}),
{%- else %}
                () -> {
{%- for binding in func.input_bindings.direct_composites %}
                    {{ binding.declaration() }};
{%- endfor %}
{%- for writer in func.input_bindings.wire_writers %}
                    try (WireWriter {{ writer.binding_name }} = new WireWriter({{ writer.size_expr }})) {
                        {{ writer.encode_expr }};
{%- endfor %}
                        return Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %});
{%- for _writer in func.input_bindings.wire_writers %}
                    }
{%- endfor %}
                },
{%- endif %}
                (future, contHandle) -> Native.{{ ac.poll }}(future, contHandle),
{%- if ac.complete_return_plan.is_void() %}
                future -> Native.{{ ac.complete }}(future),
{%- elif ac.complete_return_plan.is_direct() %}
                future -> Native.{{ ac.complete }}(future),
{%- elif ac.complete_return_plan.is_decode() %}
                future -> {
                    byte[] _buf = Native.{{ ac.complete }}(future);
                    if (_buf == null) throw new RuntimeException("FFI call returned null buffer");
                    WireReader reader = new WireReader(_buf);
                    return {{ ac.complete_return_plan.decode_expr() }};
                },
{%- elif ac.complete_return_plan.is_c_style_enum() %}
                future -> {{ ac.complete_return_plan.c_style_enum_class() }}.fromValue(Native.{{ ac.complete }}(future)),
{%- elif ac.complete_return_plan.is_handle() %}
                future -> {
                    long _handle = Native.{{ ac.complete }}(future);
{%- if ac.complete_return_plan.handle_nullable() %}
                    if (_handle == 0L) return null;
{%- endif %}
                    return new {{ ac.complete_return_plan.handle_class() }}(_handle);
                },
{%- elif ac.complete_return_plan.is_callback() %}
                future -> {
                    long _handle = Native.{{ ac.complete }}(future);
{%- if ac.complete_return_plan.callback_nullable() %}
                    if (_handle == 0L) return null;
{%- endif %}
                    return {{ ac.complete_return_plan.callback_bridge_class() }}.wrap(_handle);
                },
{%- elif ac.complete_return_plan.is_result() %}
                future -> {
                    byte[] _buf = Native.{{ ac.complete }}(future);
                    if (_buf == null) throw new RuntimeException("FFI call returned null buffer");
                    WireReader reader = new WireReader(_buf);
                    if (reader.readI8() != 0) {
{%- if ac.complete_return_plan.result_err_throws_directly() %}
                        throw {{ ac.complete_return_plan.result_err_decode() }};
{%- elif ac.complete_return_plan.result_has_typed_exception() %}
                        throw new {{ ac.complete_return_plan.result_err_exception_class() }}({{ ac.complete_return_plan.result_err_decode() }});
{%- elif ac.complete_return_plan.result_err_is_string() %}
                        throw new RuntimeException({{ ac.complete_return_plan.result_err_decode() }});
{%- else %}
                        throw new RuntimeException(String.valueOf({{ ac.complete_return_plan.result_err_decode() }}));
{%- endif %}
                    }
{%- if func.return_type == "void" %}
                    return null;
{%- else %}
                    return {{ ac.complete_return_plan.result_ok_decode() }};
{%- endif %}
                },
{%- endif %}
                future -> Native.{{ ac.free }}(future),
                future -> Native.{{ ac.cancel }}(future)
        );
    }
{%- when None %}
{%- endmatch %}
{%- else %}

{{ self::javadoc_block(func.doc, "    ") }}    public static {{ func.return_type }} {{ func.name }}({% for param in func.params %}{{ param.java_type }} {{ param.name }}{% if !loop.last %}, {% endif %}{% endfor %}) {
{%- for binding in func.input_bindings.direct_composites %}
        {{ binding.declaration() }};
{%- endfor %}
{%- if func.input_bindings.wire_writers.is_empty() %}
{%- if func.return_plan.is_void() %}
        Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %});
{%- elif func.return_plan.is_direct() %}
        return Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %});
{%- elif func.return_plan.is_c_style_enum() %}
        return {{ func.return_plan.c_style_enum_class() }}.fromValue(Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %}));
{%- elif func.return_plan.is_callback() %}
        long _handle = Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %});
{%- if func.return_plan.callback_nullable() %}
        if (_handle == 0L) return null;
{%- endif %}
        return {{ func.return_plan.callback_bridge_class() }}.wrap(_handle);
{%- elif func.return_plan.is_decode() %}
        byte[] _buf = Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %});
        if (_buf == null) throw new RuntimeException("FFI call returned null buffer");
        WireReader reader = new WireReader(_buf);
        return {{ func.return_plan.decode_expr() }};
{%- elif func.return_plan.is_result() %}
        byte[] _buf = Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %});
        if (_buf == null) throw new RuntimeException("FFI call returned null buffer");
        WireReader reader = new WireReader(_buf);
        if (reader.readI8() != 0) {
{%- if func.return_plan.result_err_throws_directly() %}
            throw {{ func.return_plan.result_err_decode() }};
{%- elif func.return_plan.result_has_typed_exception() %}
            throw new {{ func.return_plan.result_err_exception_class() }}({{ func.return_plan.result_err_decode() }});
{%- elif func.return_plan.result_err_is_string() %}
            throw new RuntimeException({{ func.return_plan.result_err_decode() }});
{%- else %}
            throw new RuntimeException(String.valueOf({{ func.return_plan.result_err_decode() }}));
{%- endif %}
        }
{%- if func.return_type == "void" %}
{%- else %}
        return {{ func.return_plan.result_ok_decode() }};
{%- endif %}
{%- endif %}
{%- else %}
        try (
{%- for writer in func.input_bindings.wire_writers %}
            WireWriter {{ writer.binding_name }} = new WireWriter({{ writer.size_expr }}){% if !loop.last %};{% endif %}
{%- endfor %}
        ) {
{%- for writer in func.input_bindings.wire_writers %}
            {{ writer.encode_expr }};
{%- endfor %}
{%- if func.return_plan.is_void() %}
            Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %});
{%- elif func.return_plan.is_direct() %}
            return Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %});
{%- elif func.return_plan.is_c_style_enum() %}
            return {{ func.return_plan.c_style_enum_class() }}.fromValue(Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %}));
{%- elif func.return_plan.is_callback() %}
            long _handle = Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %});
{%- if func.return_plan.callback_nullable() %}
            if (_handle == 0L) return null;
{%- endif %}
            return {{ func.return_plan.callback_bridge_class() }}.wrap(_handle);
{%- elif func.return_plan.is_decode() %}
            byte[] _buf = Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %});
            if (_buf == null) throw new RuntimeException("FFI call returned null buffer");
            WireReader reader = new WireReader(_buf);
            return {{ func.return_plan.decode_expr() }};
{%- elif func.return_plan.is_result() %}
            byte[] _buf = Native.{{ func.ffi_name }}({% for param in func.params %}{{ param.native_expr }}{% if !loop.last %}, {% endif %}{% endfor %});
            if (_buf == null) throw new RuntimeException("FFI call returned null buffer");
            WireReader reader = new WireReader(_buf);
            if (reader.readI8() != 0) {
{%- if func.return_plan.result_err_throws_directly() %}
                throw {{ func.return_plan.result_err_decode() }};
{%- elif func.return_plan.result_has_typed_exception() %}
                throw new {{ func.return_plan.result_err_exception_class() }}({{ func.return_plan.result_err_decode() }});
{%- elif func.return_plan.result_err_is_string() %}
                throw new RuntimeException({{ func.return_plan.result_err_decode() }});
{%- else %}
                throw new RuntimeException(String.valueOf({{ func.return_plan.result_err_decode() }}));
{%- endif %}
            }
{%- if func.return_type == "void" %}
{%- else %}
            return {{ func.return_plan.result_ok_decode() }};
{%- endif %}
{%- endif %}
        }
{%- endif %}
    }
{%- endif %}
{%- endfor %}
}