6个版本 (破坏性更新)

0.5.0 2022年2月27日
0.4.0 2022年2月24日
0.3.1 2021年6月24日
0.2.0 2021年6月23日
0.1.0 2021年6月16日

#901 in 编码

MIT 许可证

85KB
2.5K SLoC

erl_nif

此crate提供了对erl_nif C API的绑定,使得在Rust中编写Erlang和Elixir的本地扩展变得容易。

示例

在Rust中编写你的NIF

erl_nif::init!(
  name: "Elixir.Add",
  funcs: [add],
);

#[erl_nif::nif]
fn add(a: u64, b: u64) -> Result<u64, String> {
  Ok(a + b)
}

然后将其加载到Elixir中。

defmodule Add do
  @on_load {:init, 0}
  def init do
    path = :filename.join(:code.priv_dir(:add), "libadd")
    :ok = :erlang.load_nif(path, nil)
  end

  def add(_) do
    :erlang.nif_error(:nif_not_loaded)
  end
end

请参阅示例文件夹以获取完整示例。

Serde集成

为了简化在Rust和Elixir之间移动数据结构,erl_nif crate支持与serde集成。

#[derive(serde::Serialize, serde::Deserialize)]
#[serde(rename = "Elixir.Example.Contact")]
struct Contact {
  name: String,
  email: String,
}
defmodule Example do
  defmodule Contact do
    defstruct [
      :name,
      :email
    ]
  end
end

依赖项

~2.5MB
~54K SLoC