2 个不稳定版本

0.3.0 2024年1月26日
0.2.2 2023年2月4日
0.2.1 2023年2月3日
0.2.0 2023年2月3日
0.1.0 2023年1月1日

HTTP 服务器 中排名 434

每月下载量 37

MIT 许可证 MIT

53KB
565

Swim ⚡🏊

Crates.io docs.rs Crates.io GitHub Workflow Status Crates.io

一种有见解的内置方法来构建 Rust 网络框架。

理念是取 Rust 生态系统的最佳部分,并将它们组合成一个易于使用且提供良好开发者体验的框架。

安装

将以下内容添加到您的 Cargo.toml 文件中。

[dependencies]
swim = "0.2"

特性

  • 使用 hypertokio 快速运行
  • 强大的路由 routerify
  • CLI 工具 cargo-swim(即将推出)
  • 数据库支持 SeaORM(计划中)
  • 模板 Tera(计划中)
  • 依赖注入(计划中)

构建项目

您通过定义一个实现 Project 特性的 struct 来定义一个项目。它是框架中的最高级抽象。它负责定义项目的设置、应用程序和中间件。

use swim::prelude::*;

struct MyProject;

impl Project for MyProject {
    fn settings(&self) -> Settings {
        Settings::builder()
            .extend_ron(relative!("settings.ron"))
            .build()
            .unwrap()
    }

    fn apps(&self) -> Vec<Box<dyn App>> {
        vec! [
            MyApp.into()
        ]
    }

    fn middleware(&self) -> Vec<Box<dyn Middleware>> {
        vec! [
            MyMiddleware.into()
        ]
    }
}

构建应用程序

您通过定义一个实现 App 特性的 struct 来定义一个应用程序。它负责定义应用程序的路由和视图。

use swim::prelude::*;

struct MyApp;

impl App for MyApp {
    fn mount(&self) -> &'static str {
        "/"
    }

    fn config(&self) -> AppConfig {
        AppConfig::with_name("MyApp")
    }

    fn models(&self) -> Vec<Box<dyn Model>> {
        vec! []
    }

    fn routes(&self) -> Vec<Route> {
        vec! [
            Route::new("/", IndexView),
            Route::new("/hello", HelloView),
            Route::new("/greeting/:name", GreetingView),
        ]
    }
}

构建视图

您通过定义一个实现 View 特性的 struct 来定义一个视图。它负责处理请求并返回响应。您可以实现您想要处理的特定 HTTP 方法。

#[derive(Debug)]
pub struct HelloView;

#[async_trait::async_trait]
impl View for HelloView {
    async fn get(&self, request: Request<Body>) -> Result<Response<Body>> {
        Ok(Response::builder()
            .status(StatusCode::OK)
            .body(Body::from("Say hello to Swim! "))
            .unwrap())
    }

    async fn post(&self, request: Request<Body>) -> Result<Response<Body>> {
        Ok(Response::builder()
            .status(StatusCode::OK)
            .body(Body::from("It's a post request! "))
            .unwrap())
    }
}

定义中间件

您通过定义一个实现 Middleware 特性的 struct 来定义一个中间件。您可以钩入 prepost 方法,它们能够修改即将到来的请求和响应(或者您也可以简单地使用这些来监控流量)。

#[derive(Debug)]
pub struct Logger;

#[async_trait::async_trait]
impl Middleware for Logger {
    async fn pre(&self, request: Request<Body>) -> Result<Request<Body>> {
        println! ("New request: {:?}", request.uri());

        Ok(request)
    }

    async fn post(&self, response: Response<Body>) -> Result<Response<Body>> {
        println! ("Response: {:?}", response.status());

        Ok(response)
    }
}

运行项目

您可以使用优雅的 swim 宏来运行您的项目。

#[tokio::main(flavor = "multi_thread")]
async fn main() {
    swim! (MyProject, host = "localhost", port = 8000);
}

当前状态

设备已构建,但电池尚未包含。

贡献

如有任何想法或建议,请随意提出问题或发送PR。这个项目全在于创新和提升开发者体验。

依赖关系

~12-23MB
~313K SLoC