1 个不稳定版本

使用旧的 Rust 2015

0.0.1 2018年8月6日

#9#akka

MIT 许可证

4KB

warp-dsl

Build Status

用于编写 warp 路由的 DSL,灵感来自 Akka HTTP

目前,这个实现只是一个概念验证。

它在 Rust 稳定版上工作,使用 proc-macro-hack

入门指南

  1. 将以下依赖项添加到您的 Cargo.toml

    [dependencies]
    warp = "0.1"
    warp_dsl = "0.0.1"
    
  2. 使用 #[macro_use] 声明这两个 crate

    #[macro_use] extern crate warp;
    #[macro_use] extern crate warp_dsl;
    
  3. 编写一些路由

    use warp::Filter;
    
    fn main() {
        let routes = router!(
            path("foo" / u64) |num| {
                get {
                    complete { format!("GET /foo/{}\n", num) }
                }
    
                post {
                    complete { format!("POST /foo/{}\n", num) }
                }
            }
        );
    
        warp::serve(routes).run(([0; 4], 3030));
    }
    

然后,键入 cargo run 来启动具有这些路由的 HTTP 服务器。

$ cargo run &

$ curl -X POST localhost:3030/foo/1 
POST /foo/1

编写路由

本节只是一个草案。需要进一步扩展。

此 crate 使用 Akka HTTP 中的 指令 概念。

一些常见的 过滤器 被解析器识别

指令 表达式
path(...) path!(...)
index warp::index()
get, post, put, … HTTP 方法
cookie("..") ::warp::filters::cookie::cookie
cookie(optional"..") ::warp::filters::cookie::optional

任何函数都可以用作指令,如果

  • 它返回一个 Filter
  • 表达式被括号包围。

嵌套指令通过使用 Filter::and 组合。同一级别的指令通过使用 Filter::or 组合。

可以使用 & 运算符组合嵌套指令。 foo & bar { ... } 等同于 foo { bar { ... } }

HTTP方法已移动到过滤器的顶部,因为在wrap 0.1版本中,它们不能与and()一起使用。

响应是通过使用complete指令来设置的。

调试

如果您在编写路由时遇到问题,验证生成的代码可能会有所帮助。将WARPDSL_DEBUG设置为output,那么每次调用router!()的代码都会打印到stderr。

使用入门部分的代码,您会得到以下输出

======== [DEBUG:OUTPUT] ========
(((::warp::get((path!("foo" / u64)).map(|num| {format ! ( "GET /foo/{}\n" , num )}))))
.or((::warp::post((path!("foo" / u64)).map(|num| {format ! ( "POST /foo/{}\n" , num )})))))
================================

依赖项

~225KB