open_lark/core/trait_system/
macros.rs

1/// 核心宏:为Builder类型自动实现ExecutableBuilder trait
2///
3/// 这个宏消除了手动实现重复execute方法的需要,
4/// 通过声明式配置自动生成trait实现。
5///
6/// # 参数
7/// - `$builder`: Builder类型名称
8/// - `$service`: 服务类型名称  
9/// - `$request`: 请求类型名称
10/// - `$response`: 响应类型名称
11/// - `$method`: 服务方法名称
12///
13/// # 生成的代码
14/// 为指定的Builder类型实现ExecutableBuilder trait,包括:
15/// - `execute()` 方法:调用 `service.$method(self.build(), None)`
16/// - `execute_with_options()` 方法:调用 `service.$method(self.build(), Some(option))`
17///
18/// # Example
19/// ```rust,ignore
20/// impl_executable_builder!(
21///     UploadMediaRequestBuilder,
22///     MediaService,
23///     UploadMediaRequest,
24///     BaseResponse<UploadMediaRespData>,
25///     upload_all
26/// );
27/// ```
28#[macro_export]
29macro_rules! impl_executable_builder {
30    (
31        $builder:ty,
32        $service:ty,
33        $request:ty,
34        $response:ty,
35        $method:ident
36    ) => {
37        #[async_trait::async_trait]
38        impl $crate::core::trait_system::ExecutableBuilder<$service, $request, $response>
39            for $builder
40        {
41            fn build(self) -> $request {
42                self.build()
43            }
44
45            async fn execute(self, service: &$service) -> $crate::core::SDKResult<$response> {
46                service.$method(&self.build(), None).await
47            }
48
49            async fn execute_with_options(
50                self,
51                service: &$service,
52                option: $crate::core::req_option::RequestOption,
53            ) -> $crate::core::SDKResult<$response> {
54                service.$method(&self.build(), Some(option)).await
55            }
56        }
57    };
58}
59
60/// 为使用值类型参数的Builder实现ExecutableBuilder trait
61///
62/// 与主宏的差异:服务方法接受值类型而不是引用类型的Request
63#[macro_export]
64macro_rules! impl_executable_builder_owned {
65    (
66        $builder:ty,
67        $service:ty,
68        $request:ty,
69        $response:ty,
70        $method:ident
71    ) => {
72        #[async_trait::async_trait]
73        impl $crate::core::trait_system::ExecutableBuilder<$service, $request, $response>
74            for $builder
75        {
76            fn build(self) -> $request {
77                self.build()
78            }
79
80            async fn execute(self, service: &$service) -> $crate::core::SDKResult<$response> {
81                service.$method(self.build(), None).await
82            }
83
84            async fn execute_with_options(
85                self,
86                service: &$service,
87                option: $crate::core::req_option::RequestOption,
88            ) -> $crate::core::SDKResult<$response> {
89                service.$method(self.build(), Some(option)).await
90            }
91        }
92    };
93}
94
95/// 为直接使用Config参数的独立函数实现ExecutableBuilder trait
96///
97/// 这个宏用于那些不通过服务而是直接调用独立函数的Builder类型
98#[macro_export]
99macro_rules! impl_executable_builder_config {
100    (
101        $builder:ty,
102        $request:ty,
103        $response:ty,
104        $function:ident
105    ) => {
106        impl $builder {
107            /// 执行请求
108            pub async fn execute(
109                self,
110                config: &$crate::core::config::Config,
111            ) -> $crate::core::SDKResult<$response> {
112                $function(self.build(), config, None).await
113            }
114
115            /// 执行请求(带选项)
116            pub async fn execute_with_options(
117                self,
118                config: &$crate::core::config::Config,
119                option: $crate::core::req_option::RequestOption,
120            ) -> $crate::core::SDKResult<$response> {
121                $function(self.build(), config, Some(option)).await
122            }
123        }
124    };
125}