Skip to main content

openlark_docs/
macros.rs

1/// 核心宏:为Builder类型自动实现ExecutableBuilder trait
2///
3/// 这个宏消除了手动实现重复execute方法的需要,
4/// 通过声明式配置自动生成trait实现。
5#[macro_export]
6macro_rules! impl_executable_builder {
7    (
8        $builder:ty,
9        $service:ty,
10        $request:ty,
11        $response:ty,
12        $method:ident
13    ) => {
14        impl openlark_core::trait_system::ExecutableBuilder<$service, $request, $response>
15            for $builder
16        {
17            fn build(self) -> $request {
18                self.build()
19            }
20
21            async fn execute(self, service: &$service) -> openlark_core::SDKResult<$response> {
22                let request = self.build();
23                service.$method(&request, None).await
24            }
25
26            async fn execute_with_options(
27                self,
28                service: &$service,
29                option: openlark_core::req_option::RequestOption,
30            ) -> openlark_core::SDKResult<$response> {
31                let request = self.build();
32                service.$method(&request, Some(option)).await
33            }
34        }
35    };
36}
37
38/// 为使用值类型参数的Builder实现ExecutableBuilder trait
39#[macro_export]
40macro_rules! impl_executable_builder_owned {
41    (
42        $builder:ty,
43        $service:ty,
44        $request:ty,
45        $response:ty,
46        $method:ident
47    ) => {
48        impl openlark_core::trait_system::ExecutableBuilder<$service, $request, $response>
49            for $builder
50        {
51            fn build(self) -> $request {
52                self.build()
53            }
54
55            async fn execute(self, service: &$service) -> openlark_core::SDKResult<$response> {
56                let request = self.build();
57                service.$method(request, None).await
58            }
59
60            async fn execute_with_options(
61                self,
62                service: &$service,
63                option: openlark_core::req_option::RequestOption,
64            ) -> openlark_core::SDKResult<$response> {
65                let request = self.build();
66                service.$method(request, Some(option)).await
67            }
68        }
69    };
70}
71// pub use impl_executable_builder_owned; // 暂时注释掉未使用的导入