1 个不稳定版本

0.1.0 2020年5月16日

#1799过程宏

Apache-2.0/MIT

10KB
166

FerrisExtensions

BoxedAsyncRecursion

此宏 #[boxed_async_recursion] 用于帮助使用 async/.await 进行递归调用

之前,为了使用 async/.await 编写递归,您应该使用以下技巧

fn recursive(k: u8, l: u32) -> BoxFuture<'static, u8> {
    async move {
        recursive(k, l).await;
        recursive(k, l).await;
        2u8
    }.boxed()
}

使用此crate可以简化代码如下

#[boxed_async_recursion]
async fn recursive(k: u8, l: u32) -> u8 {
    recursive(k, l).await;
    recursive(k, l).await;
    2u8
}

底层编译器宏仍然生成 BoxFuture 和 async move,但现在代码更容易理解

MultipleResultErrors

此宏 #[multiple_result_errors] 用于帮助处理函数的多个错误

示例

#[multiple_result_errors]
fn handle_file() -> Result<(), (IOError, IOError2)>
{
    get_io_error()?;
    Ok(())
}
fn main() {
    let res = handle_file();
    match res {
        Ok(t) => {},
        Err(err) => {
            match err {
                HandleFileResultErrors::IOError(err0) => {},
                HandleFileResultErrors::IOError2(err1) => {},
            };
        }
    };
}

在此示例中,使用宏 #[multiple_result_errors] 将生成匿名枚举 Handle22UrlResultErrors,简化了多个错误的处理

依赖关系

~1.5MB
~38K SLoC