2个不稳定版本
使用旧的Rust 2015
0.2.0 | 2018年10月14日 |
---|---|
0.1.0 | 2018年10月13日 |
#22 in #elixir
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_eetf
crate将Rust数据类型序列化/反序列化为Erlang外部项格式,适合传递给/从binary_to_term
/term_to_binary
接收。
假设您以数据包模式开始端口,建议您在应用程序的main
函数中使用stdio
或nouse_stdio
函数创建一个IOPort
。然后,您可以使用该IOPort
上的sender
和receiver
属性与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