2个不稳定版本

0.2.0 2023年10月4日
0.1.0 2023年10月3日

#11 in #http-router

MIT许可证

35KB
585 行代码(不含注释)

Front Line

crates.io docs.rs

一个用于Rust的声明式、零拷贝HTTP路由器。

“front-line”包提供基于HTTP请求方法和路径进行路由的实用工具。通过声明式宏驱动方法,它适用于复杂和简单的用例。

目录

特性

  • 声明式:借助proc-macro属性,您可以轻松地将路由定义为枚举。
  • 零拷贝捕获:路径中的动态段,如/users/{id},可以捕获而无需进行不必要的数据复制,从而确保高效的内存使用。
  • 无调度:该包专注于基于路径的路由解析,调度方法则由用户自行决定。

基本用法

use front_line::{FrontLine, HttpVersion, RouterResult, Router};

#[derive(FrontLine)]
enum MarketingRoutes {
    #[get("/")]
    RenderIndex,
    #[get("/sign-up")]
    RenderSignUp,
    #[post("/sign-up")]
    ProcessSignUp,
    #[get("/log-in")]
    RenderLogIn,
    #[post("/log-in")]
    ProcessLogIn,
    #[get("/portal")]
    RenderPortal,
}

#[derive(FrontLine)]
#[prefix("/api")]
enum ApiRoutes<'a> {
    #[get("/users")]
    GetAllUsers,
    #[post("/users")]
    CreateUser,
    #[get("/users/{id}")]
    GetUser { id: u32 },
    #[get("/users/{id}/roles/{role}")]
    GetUserRole { id: u32, role: &'a str },
    #[put("/users/{id}/roles/{role}")]
    UpdateUserRole { id: u32, role: &'a str },
}

#[derive(FrontLine)]
enum AllRoutes<'a> {
    #[flatten]
    Marketing(MarketingRoutes),
    #[flatten]
    Api(ApiRoutes<'a>),
}

// Construct an example http request, typically read from a socket.
let request = b"GET /api/users/42?a=b HTTP/1.1\r\n\r\nContent-Length: 12\r\n\r\nHello World!";

// Parse and resolve the route
let route = AllRoutes::resolve(request);

// For demonstration purposes, assert the resolved route matches expectations
assert!(matches!(route, Ok(RouterResult {
  route: Some(AllRoutes::Api(ApiRoutes::GetUser { id: 42 })),
  query: "a=b",
  version: HttpVersion::OneOne,
  head_and_body: b"Content-Length: 12\r\n\r\nHello World!",
})));

测试

使用标准cargo test命令可以正常运行测试。

然而,为了保持一致性,我们建议使用docker化的测试环境。要使用docker化的测试环境,只需makedocker(即使本地没有安装rust)。只需运行以下命令。

make test

依赖项

~2.6–4MB
~74K SLoC