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