#plumber #language-bindings #dataflow-programming

nightly plumber-rs

Plumber servlet 的基本库,用 Rust 编写

3 个版本

使用旧的 Rust 2015

0.1.2 2018 年 8 月 14 日
0.1.1 2018 年 8 月 12 日
0.1.0 2018 年 8 月 12 日

#plumber 中排名 #4

BSD-2-Clause 许可

340KB
7K SLoC

plumber-rs

这是一个 Rust 库,提供了 Plumber 数据流框架与 Rust 编程语言之间的连接。

使用此库,可以用 Rust 编程语言编写 servlet。与 C 和 C++ 不同,Rust servlet 需要一个运行时环境,可以使用 Rust Servlet Loader language/rust 设置。

如何构建 Rust servlet

使用 Cargo,你可以很容易地用 Rust 创建一个 servlet。

步骤 1 使用 cargo 创建一个库包

cargo init hello-rust --lib

步骤 2 修改 Cargo.toml

我们需要确保 cargo 可以生成一个可以被 Plumber Rust Servlet Loader 加载的动态库。我们还需要向 crate 中添加一些依赖项。

[lib]
name = "hello-rust"
crate-type= ["cdylib"]

[dependencies]
plumber-rs = {git = "https://github.com/38/plumber-rs.git"}

步骤 3 创建 servlet 对象。

在 Rust 中,servlet 实际上是一个 trait。对于同步 servlet,我们可以实现 plumber_rs::servlet::sync_servlet 这个 trait。

use plumber_rs::servlet::{SyncServlet, Unimplemented, ServletMode, ServletFuncResult, Bootstrap};
use plumber_rs::protocol::{ProtocolModel, Untyped};

struct HelloServlet {}

impl SyncServlet for HelloServlet {
    no_protocol!();
    fn init(&mut self, _args:&[&str], _model:&mut Self::ProtocolType) -> ServletFuncResult 
    {
        plumber_log!(N "Hello World");
        return Ok(());
    }
    fn exec(&mut self, _ti:TypeInstanceObject) -> ServletFuncResult  { Ok(()) }
    fn cleanup(&mut self) -> ServletFuncResult { Ok(()) }
}

步骤 4 创建 bootstrap 类型并导出入口点

struct BootstrapType{}

impl Bootstrap for BootstrapType {
    type SyncServletType = HelloServlet;
    type AsyncServletType = Unimplemented;
    fn get(_args:&[&str]) -> Result<ServletMode<Unimplemented, HelloServlet>, ()>
    {
        return Ok(ServletMode::SyncMode(HelloServlet{}));
    }
}

export_bootstrap!(BootstrapType);

步骤 5 构建 servlet

要成功构建 servlet,您需要安装 Plumber。请参阅 此处 的 plumber 安装说明。

如果您在 //usr//usr/local 或您的家目录下安装了 Plumber,您应该能够成功编译 servlet。如果您有其他安装路径,请使用 ENVROOT 环境变量指定环境根。

要构建 servlet,您可以简单地运行 cargo build

cargo build

完整 Servlet 代码

#[macro_use]
extern crate plumber_rs;
extern crate libc;

use plumber_rs::servlet::{SyncServlet, Unimplemented, ServletMode, ServletFuncResult, Bootstrap};
use plumber_rs::protocol::{ProtocolModel, Untyped};

struct HelloServlet {}

impl SyncServlet for HelloServlet {
    no_protocol!();
    fn init(&mut self, _args:&[&str], _model:&mut Self::ProtocolType) -> ServletFuncResult 
    {
        plumber_log!(N "Hello World");
        return Ok(());
    }
    fn exec(&mut self, _model:Self::DataModelType) -> ServletFuncResult  { Ok(()) }
    fn cleanup(&mut self) -> ServletFuncResult { Ok(()) }
}

struct BootstrapType{}

impl Bootstrap for BootstrapType {
    type SyncServletType = HelloServlet;
    type AsyncServletType = Unimplemented;
    fn get(_args:&[&str]) -> Result<ServletMode<Unimplemented, HelloServlet>, ()>
    {
        return Ok(ServletMode::SyncMode(HelloServlet{}));
    }
}

export_bootstrap!(BootstrapType);

无运行时依赖