ocaml-interop

build crate documentation license

Zinc-iron alloy coating is used in parts that need very good corrosion protection.

API IS CONSIDERED UNSTABLE AT THE MOMENT AND IS LIKELY TO CHANGE IN THE FUTURE

ocaml-interop is an OCaml<->Rust FFI with an emphasis on safety inspired by caml-oxide, ocaml-rs and CAMLroot.

Read the full documentation here.

Report issues on Github.

A quick taste

Convert between plain OCaml and Rust values

rust let rust_string = ocaml_string.to_rust(); // `cr` = OCaml runtime handle let new_ocaml_string = rust_string.to_ocaml(cr);

Convert between Rust and OCaml structs/records

ocaml (* OCaml *) type my_record = { string_field: string; tuple_field: (string * int); }

```rust // Rust struct MyStruct { stringfield: String, tuplefield: (String, i64), }

implconvocamlrecord! { MyStruct { stringfield: String, tuple_field: (String, i64), } }

// ...

let ruststruct = ocamlrecord.torust(); let newocamlrecord = ruststruct.to_ocaml(cr); ```

Convert between OCaml and Rust variants/enums

ocaml (* OCaml *) type my_variant = | EmptyTag | TagWithInt of int

```rust // Rust enum MyEnum { EmptyTag, TagWithInt(i64), }

implconvocaml_variant! { MyEnum { EmptyTag, TagWithInt(OCamlInt), } }

// ...

let rustenum = ocamlvariant.torust(); let newocamlvariant = rustenum.to_ocaml(cr); ```

Call OCaml functions from Rust

ocaml (* OCaml *) Callback.register "ocaml_print_endline" print_endline

```rust // Rust ocaml! { fn ocamlprintendline(s: String); }

// ...

let ocamlstring = "hello OCaml!".toboxroot(cr); ocamlprintendline(cr, &ocaml_string); ```

Call Rust functions from OCaml

rust // Rust ocaml_export! { pub fn twice_boxed_int(cr, num: OCamlRef<OCamlInt64>) -> OCaml<OCamlInt64> { let num = num.to_rust(cr); let result = num * 2; result.to_ocaml(cr) } }

```ocaml (* OCaml *) external rusttwiceboxedint: int64 -> int64 = "twiceboxed_int"

(* ... *)

let result = rusttwiceboxed_int 123L in (* ... *) ```

References and links