open_lark/service/cloud_docs/sheets/v3/data_operation/
merge_cells.rs1use reqwest::Method;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5 core::{
6 api_req::ApiRequest,
7 api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
8 constants::AccessTokenType,
9 endpoints::cloud_docs::*,
10 http::Transport,
11 req_option::RequestOption,
12 standard_response::StandardResponse,
13 validation::{self, ValidationResult},
14 SDKResult,
15 },
16 impl_executable_builder_owned,
17 service::sheets::v3::DataOperationService,
18};
19
20impl DataOperationService {
21 pub async fn merge_cells(
23 &self,
24 request: MergeCellsRequest,
25 option: Option<RequestOption>,
26 ) -> SDKResult<MergeCellsResponseData> {
27 let mut api_req = request.api_request;
28 api_req.http_method = Method::POST;
29 api_req.api_path = SHEETS_V3_SPREADSHEET_MERGE_CELLS
30 .replace("{}", &request.spreadsheet_token)
31 .replace("{}", &request.sheet_id);
32 api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
33
34 let api_resp: BaseResponse<MergeCellsResponseData> =
35 Transport::request(api_req, &self.config, option).await?;
36
37 api_resp.into_result()
38 }
39}
40
41#[derive(Default, Debug, Serialize, Deserialize)]
43pub struct MergeCellsRequest {
44 #[serde(skip)]
45 api_request: ApiRequest,
46 spreadsheet_token: String,
48 sheet_id: String,
50 range: String,
52 merge_type: String,
54}
55
56impl MergeCellsRequest {
57 pub fn builder() -> MergeCellsRequestBuilder {
58 MergeCellsRequestBuilder::default()
59 }
60
61 pub fn validate(&self) -> SDKResult<()> {
63 if self.spreadsheet_token.is_empty() {
65 return Err(crate::core::error::LarkAPIError::illegal_param(
66 "spreadsheet_token cannot be empty".to_string(),
67 ));
68 }
69
70 if self.sheet_id.is_empty() {
71 return Err(crate::core::error::LarkAPIError::illegal_param(
72 "sheet_id cannot be empty".to_string(),
73 ));
74 }
75
76 if self.range.is_empty() {
77 return Err(crate::core::error::LarkAPIError::illegal_param(
78 "range cannot be empty".to_string(),
79 ));
80 }
81
82 if let ValidationResult::Invalid(msg) = validation::validate_merge_range(&self.range) {
84 return Err(crate::core::error::LarkAPIError::illegal_param(format!(
85 "Invalid merge range '{}': {}",
86 self.range, msg
87 )));
88 }
89
90 let valid_merge_types = ["MERGE_ALL", "MERGE_COLUMNS", "MERGE_ROWS"];
92 if !valid_merge_types.contains(&self.merge_type.as_str()) {
93 return Err(crate::core::error::LarkAPIError::illegal_param(format!(
94 "Invalid merge_type '{}'. Must be one of: MERGE_ALL, MERGE_COLUMNS, MERGE_ROWS",
95 self.merge_type
96 )));
97 }
98
99 Ok(())
100 }
101}
102
103#[derive(Default)]
104pub struct MergeCellsRequestBuilder {
105 request: MergeCellsRequest,
106}
107
108impl MergeCellsRequestBuilder {
109 pub fn spreadsheet_token(mut self, spreadsheet_token: impl ToString) -> Self {
110 self.request.spreadsheet_token = spreadsheet_token.to_string();
111 self
112 }
113
114 pub fn sheet_id(mut self, sheet_id: impl ToString) -> Self {
115 self.request.sheet_id = sheet_id.to_string();
116 self
117 }
118
119 pub fn range(mut self, range: impl ToString) -> Self {
120 self.request.range = range.to_string();
121 self
122 }
123
124 pub fn merge_type(mut self, merge_type: impl ToString) -> Self {
129 self.request.merge_type = merge_type.to_string();
130 self
131 }
132
133 pub fn build(self) -> MergeCellsRequest {
134 let mut request = self.request;
135 request.api_request.body = serde_json::to_vec(&request).unwrap();
136 request
137 }
138
139 pub fn validate(&self) -> SDKResult<()> {
141 if self.request.spreadsheet_token.is_empty() {
143 return Err(crate::core::error::LarkAPIError::illegal_param(
144 "spreadsheet_token cannot be empty".to_string(),
145 ));
146 }
147
148 if self.request.sheet_id.is_empty() {
149 return Err(crate::core::error::LarkAPIError::illegal_param(
150 "sheet_id cannot be empty".to_string(),
151 ));
152 }
153
154 if self.request.range.is_empty() {
155 return Err(crate::core::error::LarkAPIError::illegal_param(
156 "range cannot be empty".to_string(),
157 ));
158 }
159
160 if let ValidationResult::Invalid(msg) =
162 validation::validate_merge_range(&self.request.range)
163 {
164 return Err(crate::core::error::LarkAPIError::illegal_param(format!(
165 "Invalid merge range '{}': {}",
166 self.request.range, msg
167 )));
168 }
169
170 let valid_merge_types = ["MERGE_ALL", "MERGE_COLUMNS", "MERGE_ROWS"];
172 if !valid_merge_types.contains(&self.request.merge_type.as_str()) {
173 return Err(crate::core::error::LarkAPIError::illegal_param(format!(
174 "Invalid merge_type '{}'. Must be one of: MERGE_ALL, MERGE_COLUMNS, MERGE_ROWS",
175 self.request.merge_type
176 )));
177 }
178
179 Ok(())
180 }
181}
182
183impl_executable_builder_owned!(
185 MergeCellsRequestBuilder,
186 DataOperationService,
187 MergeCellsRequest,
188 MergeCellsResponseData,
189 merge_cells
190);
191
192#[derive(Deserialize, Debug)]
194pub struct MergeCellsResponseData {
195 pub merged_range: String,
197}
198
199impl ApiResponseTrait for MergeCellsResponseData {
200 fn data_format() -> ResponseFormat {
201 ResponseFormat::Data
202 }
203}
204
205#[cfg(test)]
206#[allow(unused_variables, unused_unsafe)]
207mod test {
208 use serde_json::json;
209
210 use super::MergeCellsResponseData;
211
212 #[test]
213 fn test_merge_cells_response() {
214 let json = json!({
215 "merged_range": "A1:C3"
216 });
217
218 let response: MergeCellsResponseData = serde_json::from_value(json).unwrap();
219 assert_eq!(response.merged_range, "A1:C3");
220 }
221}