#async-trait #middleware #async #traits #monads #future #logging

async-middleware

使用元组和异步特质转换实现的简单的异步 monad(ish) 中间件

2 个版本 (1 个稳定版)

1.0.0 2022年7月21日
0.1.0 2022年7月21日

#1494 in 异步

MIT 许可证

18KB
360

async-middleware

latest version documentation license

提供一个方法,可以将多个异步中间件函数串联起来,在输入 -> 输出的每个中间件之间都是类型安全的。这允许您像 monad 一样组合 A -> B -> C,但又不那么正式。尽管在理论上可以将它用作 monad 库,但它并没有真正设置来处理身份、映射、解包、for(更正式和惯用的方法 https://medium.com/swlh/monad-interface-rust-edition-bd6486b93607 会更好),但是缺少一些使这更容易的东西,比如异步闭包。由于 Rust 中缺少异步闭包,像包装现有的异步函数这样的东西是非常困难的。无论如何,这提供了一种简单的中间件链式调用。

示例

// import * as this provides all the trait implementations by default
use async_middleware::*;

async fn producer() -> i32 {
    3
}

async fn multipler(i: i32) -> i32 {
    i * 32
}

async fn stringer(i: i32) -> String {
    i.to_string()
}

async fn logger(s: String) {
    println!("{}", s);
}

async fn log_nums(i: i32) {
    println!("{}", i);
}

#[test]
fn test_piper_tuple() {
    pipe((producer, log_nums));
    pipe((producer, stringer, logger));
    pipe((producer, multipler, stringer, logger));
    pipe((multipler, multipler, multipler));
    pipe((multipler, multipler, stringer));

    // alternative syntax
    (producer, log_nums).pipe();
    (producer, stringer, logger).pipe();
    (producer, multipler, stringer, logger).pipe();
    (multipler, multipler, multipler).pipe();
    (multipler, multipler, stringer).pipe();

    // pipe different pipes
    let m = (producer, multipler).pipe();
    let m = (m, multipler).pipe();
    let m = pipe((m, stringer));

    assert_eq!(String::from("3072"), m.call(()).await);
}

#[async_std::test]
async fn test_piper_tuple_inputs() {
    let m = (multipler, multipler, stringer).pipe();
    assert_eq!(String::from("1024"), m.call(1).await);
    assert_eq!(String::from("2048"), m.call(2).await);
    assert_eq!(String::from("3072"), m.call(3).await);
}

#[test]
fn test_convert_transform() {
    convert(multipler, stringer);
    convert(multipler, multipler);
}

#[test]
fn test_source_transform() {
    convert(producer, multipler);
}

#[test]
fn test_source_sink() {
    convert(producer, log_nums);
}

#[test]
fn test_transform() {
    convert(convert(producer, multipler), stringer);
}

#[test]
fn test_transform_source_transform_sink() {
    convert(convert(convert(producer, multipler), stringer), logger);
}

依赖项

~280–730KB
~18K SLoC