3个版本

0.1.2 2024年5月30日
0.1.1 2024年5月24日
0.1.0 2024年5月24日

#879 in 异步

Download history 230/week @ 2024-05-18 230/week @ 2024-05-25 31/week @ 2024-06-01 3/week @ 2024-06-08

每月 62 次下载
busstop 中使用

MIT 协议

11KB
114 代码行

#Simple Middleware

提供可按各种方式使用的 middleware 模式。中间件模式允许您通过一系列函数/方法传递有效负载,最终得到特定结果。

每个函数都有以下能力

  • 将执行推进到下一个中间件
  • 在调用下一个中间件之前拦截执行
  • 后处理来自先前中间件的结果

以下是一个包含六个中间件(其中 last 是目标)的示意图。执行从 m5 开始,逐步推进到 m4、m3 等等。


                      Payload                        
                         |                           
                         v                           
 +--------------------------------------------------+
 |                     middleware #5                |
 |   +------------------------------------------+   |
 |   |                 middleware #4            |   |
 |   |   +---------------------------------+    |   |
 |   |   |             middleware #3       |    |   |
 |   |   |   +-------------------------+   |    |   |
 |   |   |   |         middleware #2   |   |    |   |
 |   |   |   |      +-----------+      |   |    |   |
 |   |   |   |      |   last    |      |   |    |   |
 |   |   |   |      +-----------+      |   |    |   |
 |   |   |   +-------------------------+   |    |   |
 |   |   +---------------------------------+    |   |
 |   +------------------------------------------+   |
 +------------------------+-------------------------+
                          |                          
                          |                          
                          v                          
                       Result                        
                             

基本示例

 use simple_middleware::Manager;


 #[tokio::main]
 async fn main() {
     // 1. Create an instance of the manager used to pass value and get result from the middlewares
     let m = Manager::new();

     // 2. This will be the last middleware to be called. Execution starts from the last middleware added to the collection.
     //    Note: this middleware is not calling the next one.
     m.next(|v, _n| Box::pin(async move { v + 1 }));

     // 3. In this example, this is the last middleware.
     //    It will be the first to be executed
     m.next(|value, next| {
         Box::pin(async move {
             // This is how you call the next middleware; by calling the `call` method on `next`
             next.call(value * 3).await
         })
     });

     // 4. A value is being passed through the middlewares
     //    Note: We are also specifying the expected type that should be returned
     let ans: i32 = m.send(33).await;

     println!("ans: {ans}");
 }

示例

示例文件夹包含简单和完整的示例。如果示例都没有帮助,请提供您的用例,我将尝试提供其中一个。

反馈

如果您觉得这个包有用,请为仓库点星。同时提交您的问题和建议。

许可

MIT许可

以下是对任何获得此软件及其相关文档文件(以下简称“软件”)副本的个人的免费许可,允许其在不受限制的情况下处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向提供软件的个人这样做,前提是以下条件

上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和非侵权性。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是基于合同、侵权或其他方式,无论是否与软件或其使用或任何其他交易有关。

依赖

~3–4.5MB
~80K SLoC