1 个不稳定版本
0.1.0 | 2020年7月26日 |
---|
#10 in #conn
用于 jeep-train
36KB
884 行
关于
概览
Jeep train 是一个实验性的高级 Web 框架
该项目完全是实验性的,并不打算用于生产环境。
开发背后的动机是
- 看看过程宏是否可以帮助有效地定义运行时高效的路由产品
- 探索最小化样板代码/学习成本的方法
特性
- 在具有类似 Rails 语法的工作路由上定义您的 API 路由。API 语法简单明了,输入将转换为匹配语句
Conn
对象将在处理客户端请求的过程中传递给每个调用的函数,并作为与请求/响应数据交互的主要接口
路由
它看起来像这样。
router! {
const NAME_OF_THE_ROUTER;
scope "/api" {
scope "/v1" {
get api::v1::get;
post api::v1::create;
delete api::v1::destroy;
}
}
scope "/resource" {
resource index::resource;
}
}
示例
此代码可在 examples/resources
中找到。
use jeep_train_prelude::*;
use jeep_train_macro::{ router, server, plugin };
use jeep_train_prelude::server::jeep_train;
fn set_text_header(conn: Conn) {
conn
// obtain a mutex on response object for the user
.mut_resp()
// insert a header data
.set_headers("content-type".to_owned(), "text".to_owned());
}
fn default(conn: Conn) {
conn.mut_resp()
.set_resp(404, "not found");
}
fn lucky_seven(conn: Conn) {
if conn.path().len() == 7 {
conn.mut_resp()
.set_resp(200, "lucky seven!")
}
}
fn reject_swear_words(conn: Conn) {
if conn.path().contains("fuck") {
conn.mut_resp()
.set_resp(200, "don't swear")
}
}
plugin! {
const DEFAULT_RESPONSE;
func lucky_seven;
func default;
}
router! {
const RESOURCE_ROUTER;
scope "/resource" {
plugin set_text_header;
resource resource_module;
}
}
server! {
fn resource_server;
plugin reject_swear_words;
router RESOURCE_ROUTER;
plugin DEFAULT_RESPONSE;
}
/// # Routes that it creates
///
/// | method | path | function |
/// | --- | --- | --- |
/// | get | /resource/ | resource_module::index |
/// | get | /resource/new | resource_module::new |
/// | post | /resource/ | resource_module::create |
/// | get | /resource/show | resource_module::show |
/// | get | /resource/:id/edit | resource_module::edit |
/// | put | /resource/:id | resource_module::update |
/// | patch | /resource/:id | resource_module::update |
/// | delete | /resource/ | resource_module::destroy |
///
/// Note that `/:id` is a parameterized segment
///
fn main() {
jeep_train("localhost:3000", resource_server);
}
pub mod resource_module {
/* ...functions */
}
基准测试
Jeep train 不使用正则表达式。
然而,我认为创建具有复杂逻辑的参数化路径并不常见。
running 2 tests
test router_actix ... bench: 836,812 ns/iter (+/- 22,033)
test router_jeep_train ... bench: 1,491 ns/iter (+/- 51)
代码和详细信息可以在基准测试结果中找到
关于基准测试结果
我注意到在某些情况下无法重现此基准测试结果,并发现 router_actix 可以显著更快,在很多情况下击败了 router_jeep_train。
请勿相信基准测试
依赖项
~4–13MB
~174K SLoC