#web #async-http #web-framework #http #async #server

mendes

Rust Web工具包,专为迫不及待的完美主义者设计

81 个版本

0.9.2 2024年7月19日
0.8.0 2024年2月12日
0.5.1 2023年10月9日
0.3.2 2023年7月6日
0.0.5 2019年10月30日

#88HTTP服务器

Download history 93/week @ 2024-04-21 63/week @ 2024-04-28 97/week @ 2024-05-05 108/week @ 2024-05-12 48/week @ 2024-05-19 96/week @ 2024-05-26 98/week @ 2024-06-02 70/week @ 2024-06-09 41/week @ 2024-06-16 97/week @ 2024-06-23 88/week @ 2024-06-30 66/week @ 2024-07-07 250/week @ 2024-07-14 42/week @ 2024-07-21 47/week @ 2024-07-28

每月下载量342次

MIT/Apache

110KB
2.5K SLoC

梅德斯:专为迫不及待的完美主义者设计的Web工具包

Documentation Crates.io Build status Coverage status License: MIT License: Apache 2.0

梅德斯是一个专为迫不及待的完美主义者设计的Rust Web工具包(向Django道歉)。它的目标是

  • 模块化:更少的框架,更多的库;挑选和选择组件
  • 异步:从开始就是异步/await
  • 低模板:易于开始,但“魔法”有限
  • 类型安全:利用类型系统来降低错误处理的工作量
  • 安全:默认提供安全性;本项目没有不安全代码
  • 在稳定的Rust上运行(尽管没有关于MSRV的承诺)

梅德斯目前处于极早期阶段,可能对任何人都不适合,但对于好奇的人来说可能仅适合实验。不过,欢迎提供反馈!

最小示例

随着时间的推移,这肯定变得更加简化。

use async_trait::async_trait;
use hyper::Body;
use mendes::application::IntoResponse;
use mendes::http::request::Parts;
use mendes::http::{Response, StatusCode};
use mendes::{handler, route, Application, Context};

#[handler(GET)]
async fn hello(_: &App) -> Result<Response<Body>, Error> {
    Ok(Response::builder()
        .status(StatusCode::OK)
        .body("Hello, world".into())
        .unwrap())
}

struct App {}

#[async_trait]
impl Application for App {
    type RequestBody = ();
    type ResponseBody = Body;
    type Error = Error;

    async fn handle(mut cx: Context<Self>) -> Response<Body> {
        route!(match cx.path() {
            _ => hello,
        })
    }
}

#[derive(Debug)]
enum Error {
    Mendes(mendes::Error),
}

impl From<mendes::Error> for Error {
    fn from(e: mendes::Error) -> Self {
        Error::Mendes(e)
    }
}

impl From<&Error> for StatusCode {
    fn from(e: &Error) -> StatusCode {
        let Error::Mendes(e) = e;
        StatusCode::from(e)
    }
}

impl IntoResponse<App> for Error {
    fn into_response(self, _: &App, _: &Parts) -> Response<Body> {
        let Error::Mendes(err) = self;
        Response::builder()
            .status(StatusCode::from(&err))
            .body(err.to_string().into())
            .unwrap()
    }
}

欢迎所有反馈。请随意提交错误报告、文档请求和其他任何反馈到 问题跟踪器

梅德斯由Dirkjan Ochtman创建并维护。

依赖项

~0.3–13MB
~193K SLoC