#macro #async #struct-fields

conquer-struct

提供宏来执行并发未来解析,同时在填充结构体字段

1 个不稳定版本

0.1.0 2023年6月6日

#79#struct-fields

MIT/Apache

17KB
167

Conquer Struct

宏允许通过提供字段作为futures来构建结构体。这些宏自动并发地执行未来解析并构建结构体。

为什么

考虑一个场景,您正在尝试构建一个结构体,并且需要异步获取其字段。执行此操作的代码可能看起来像这样


async fn get_contact_info(contact_id: usize) -> Contact {
    Contact {
        name: get_contact_name(contact_id).await,
        number: get_contact_number(contact_id).await,
        is_verified: true
    }
}

看起来很简单,但现在为了提高性能,我们需要并发地调用这些函数。哦,这是一个重构。它需要我们添加更多代码,并跟踪正在执行的功能。这绝对可能,但考虑到巨大的结构体,跟踪确实很困难,您可能将不同函数的输出分配给困难的变量。

如何

引入 conquer_struct,正如其名所示,它将为您征服并发,您可以避免编写任何样板代码。让我们以上面的例子为例,看看如何使其并发


async fn get_contact_info(contact_id: usize) -> Contact {
    conquer_future!(Contact {
        name: async { get_contact_name(contact_id).await },
        number: async { get_contact_number(contact_id).await },
        is_verified: true
    }).await
}

完成了!这很简单,通过最小限度的更改,我们的代码已经变成了并发代码。

使用方法

conquer_struct为我们提供了2个宏。

conquer_future这个宏解析结构体内部提供的futures。这个宏的大致签名是


conquer_future!(StructName {
    value1: T,
    value2: async { .. } // ~ impl Future<Output = V>, considering the field
                        // accepts type V
}) -> impl Future<Output = StructName>

try_conquer_future这个宏解析结构体内部提供的futures,同时还考虑了内部存在的未来的结果。


try_conquer_future!(StructName {
    value1: T,
    value2: async { .. } // ~ impl Future<Output = Result<V, E>>, consider the field
                        // accepts type V
}) -> impl Future<Output = Result<StructName, E>>

贡献

贡献始终欢迎,在贡献之前请检查问题部分,了解可能已经完成的前期开发。对于任何改进、功能、错误修复,请首先创建问题以跟踪。

代码指南

任何添加的代码都应通过 +nightly fmt 格式化检查、clippy检查和测试。

依赖关系

~280–730KB
~17K SLoC