#port #erlang #elixir #interop

erlang_port

帮助在Rust中编写Elixir & Erlang端口的辅助库

2个不稳定版本

使用旧的Rust 2015

0.2.0 2018年10月14日
0.1.0 2018年10月13日

#22 in #elixir

MIT 许可证

20KB
290

erlang_port

一个库,简化使用Rust编写Erlang/Elixir端口的流程。

入门指南

以下说明将帮助您在本地机器上安装并运行项目副本,以便进行开发和测试。

先决条件

您需要安装Rust。Erlang、Elixir或另一个BEAM虚拟机也很有用,因为该库旨在与它们交互。不过,安装这些内容超出了本文档的范围,所以请参考其他文档。

安装

将erlang_port添加到您的Cargo.toml

erlang_port = "0"

使用

有关使用方法和示例,请参阅文档

运行测试

cargo test

版本控制

我们使用SemVer进行版本控制。有关可用的版本,请参阅CHANGELOG.md

许可证

本项目采用MIT许可证。


lib.rs:

erlang_port帮助简化在Rust中编写Erlang/Elixir端口的过程。

使用serde_eetfcrate将Rust数据类型序列化/反序列化为Erlang外部项格式,适合传递给/从binary_to_term/term_to_binary接收。

假设您以数据包模式开始端口,建议您在应用程序的main函数中使用stdionouse_stdio函数创建一个IOPort。然后,您可以使用该IOPort上的senderreceiver属性与Erlang/Elixir进行通信。

例如,如果您创建以下从端口读取字符串并将其返回为大写的Rust程序

fn lower(mut s: String) -> Result<String, String> {
    s.make_ascii_uppercase();
    Ok(s)
}

fn main() {
   use erlang_port::{PortReceive, PortSend};

  let mut port = unsafe {
      use erlang_port::PacketSize;
      erlang_port::nouse_stdio(PacketSize::Four)
  };

  for string_in in port.receiver.iter() {
      let result = lower(string_in);

      port.sender.reply(result);
  }
}

然后您可以从Elixir调用此端口

iex> port =
...>   Port.open({:spawn_executable, port_path}, [
...>       {:packet, 4},
...>       :nouse_stdio,
...>       :binary,
...>       :exit_status
...>   ])
#Port<0.1444>
iex> Port.command(port, :erlang.term_to_binary("hello"))
true
iex> receive do
...>   {^port, {:data, binary}} ->
...>     IO.puts(:erlang.binary_to_term(binary))
...> end
"HELLO"
:ok

如果您想实现基于行的端口或自定义端口协议(使用:stream选项),您可以实现PortSend/PortReceive特质。

依赖关系

~2.3–3MB
~61K SLoC