3 个版本
使用旧的 Rust 2015
0.1.2 | 2018 年 8 月 14 日 |
---|---|
0.1.1 | 2018 年 8 月 12 日 |
0.1.0 | 2018 年 8 月 12 日 |
在 #plumber 中排名 #4
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);