open_lark/service/cloud_docs/sheets/v3/data_validation/
create.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 http::Transport,
10 req_option::RequestOption,
11 SDKResult,
12 },
13 impl_executable_builder_owned,
14 service::sheets::v3::SpreadsheetSheetService,
15};
16
17impl SpreadsheetSheetService {
18 pub async fn set_data_validation(
20 &self,
21 request: SetDataValidationRequest,
22 option: Option<RequestOption>,
23 ) -> SDKResult<BaseResponse<SetDataValidationResponseData>> {
24 let mut api_req = request.api_request;
25 api_req.http_method = Method::POST;
26 api_req.api_path = format!(
27 "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/dataValidation",
28 request.spreadsheet_token, request.sheet_id
29 );
30 api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
31
32 let api_resp = Transport::request(api_req, &self.config, option).await?;
33
34 Ok(api_resp)
35 }
36}
37
38#[derive(Default, Debug, Serialize, Deserialize)]
40pub struct SetDataValidationRequest {
41 #[serde(skip)]
42 api_request: ApiRequest,
43 spreadsheet_token: String,
45 sheet_id: String,
47 data_validation: DataValidationRule,
49}
50
51impl SetDataValidationRequest {
52 pub fn builder() -> SetDataValidationRequestBuilder {
53 SetDataValidationRequestBuilder::default()
54 }
55}
56
57#[derive(Default)]
58pub struct SetDataValidationRequestBuilder {
59 request: SetDataValidationRequest,
60}
61
62impl SetDataValidationRequestBuilder {
63 pub fn spreadsheet_token(mut self, spreadsheet_token: impl ToString) -> Self {
64 self.request.spreadsheet_token = spreadsheet_token.to_string();
65 self
66 }
67
68 pub fn sheet_id(mut self, sheet_id: impl ToString) -> Self {
69 self.request.sheet_id = sheet_id.to_string();
70 self
71 }
72
73 pub fn data_validation(mut self, data_validation: DataValidationRule) -> Self {
74 self.request.data_validation = data_validation;
75 self
76 }
77
78 pub fn build(mut self) -> SetDataValidationRequest {
79 self.request.api_request.body = serde_json::to_vec(&self.request).unwrap();
80 self.request
81 }
82}
83
84#[derive(Default, Debug, Serialize, Deserialize)]
86pub struct DataValidationRule {
87 pub condition_type: String,
89 pub range: String,
91 #[serde(skip_serializing_if = "Option::is_none")]
93 pub condition_values: Option<Vec<String>>,
94 #[serde(default)]
96 pub strict: bool,
97 #[serde(skip_serializing_if = "Option::is_none")]
99 pub input_message: Option<String>,
100 #[serde(skip_serializing_if = "Option::is_none")]
102 pub error_message: Option<String>,
103 #[serde(skip_serializing_if = "Option::is_none")]
105 pub data_validation_id: Option<String>,
106}
107
108impl DataValidationRule {
109 pub fn dropdown(range: impl ToString, options: Vec<String>) -> Self {
111 Self {
112 condition_type: "dropdown".to_string(),
113 range: range.to_string(),
114 condition_values: Some(options),
115 strict: true,
116 input_message: None,
117 error_message: None,
118 data_validation_id: None,
119 }
120 }
121
122 pub fn number_range(range: impl ToString, min: f64, max: f64) -> Self {
124 Self {
125 condition_type: "number_between".to_string(),
126 range: range.to_string(),
127 condition_values: Some(vec![min.to_string(), max.to_string()]),
128 strict: true,
129 input_message: None,
130 error_message: None,
131 data_validation_id: None,
132 }
133 }
134
135 pub fn text_length(range: impl ToString, min_length: u32, max_length: u32) -> Self {
137 Self {
138 condition_type: "text_length".to_string(),
139 range: range.to_string(),
140 condition_values: Some(vec![min_length.to_string(), max_length.to_string()]),
141 strict: true,
142 input_message: None,
143 error_message: None,
144 data_validation_id: None,
145 }
146 }
147
148 pub fn with_input_message(mut self, message: impl ToString) -> Self {
150 self.input_message = Some(message.to_string());
151 self
152 }
153
154 pub fn with_error_message(mut self, message: impl ToString) -> Self {
156 self.error_message = Some(message.to_string());
157 self
158 }
159
160 pub fn with_strict(mut self, strict: bool) -> Self {
162 self.strict = strict;
163 self
164 }
165}
166
167#[derive(Deserialize, Debug)]
169pub struct SetDataValidationResponseData {
170 pub data_validation_id: String,
172 #[serde(flatten)]
174 pub data_validation: DataValidationRule,
175}
176
177impl ApiResponseTrait for SetDataValidationResponseData {
178 fn data_format() -> ResponseFormat {
179 ResponseFormat::Data
180 }
181}
182
183#[cfg(test)]
184mod test {
185 use super::*;
186 use serde_json::json;
187
188 #[test]
189 fn test_data_validation_rule_creation() {
190 let validation =
191 DataValidationRule::dropdown("A1:A10", vec!["选项1".to_string(), "选项2".to_string()]);
192 assert_eq!(validation.condition_type, "dropdown");
193 assert_eq!(validation.range, "A1:A10");
194 assert!(validation.strict);
195 assert_eq!(validation.condition_values.as_ref().unwrap().len(), 2);
196 }
197
198 #[test]
199 fn test_set_data_validation_response() {
200 let json = json!({
201 "data_validation_id": "dv_001",
202 "condition_type": "dropdown",
203 "range": "A1:A10",
204 "condition_values": ["选项1", "选项2"],
205 "strict": true,
206 "input_message": "请选择一个选项",
207 "error_message": "输入无效"
208 });
209
210 let response: SetDataValidationResponseData = serde_json::from_value(json).unwrap();
211 assert_eq!(response.data_validation_id, "dv_001");
212 assert_eq!(response.data_validation.condition_type, "dropdown");
213 }
214}
215
216impl_executable_builder_owned!(
218 SetDataValidationRequestBuilder,
219 SpreadsheetSheetService,
220 SetDataValidationRequest,
221 BaseResponse<SetDataValidationResponseData>,
222 set_data_validation
223);