open_lark/service/cloud_docs/sheets/v3/data_operation/
write_images.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::DataOperationService,
15};
16
17impl DataOperationService {
18 pub async fn write_images(
20 &self,
21 request: WriteImagesRequest,
22 option: Option<RequestOption>,
23 ) -> SDKResult<BaseResponse<WriteImagesResponseData>> {
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/{}/values_image",
28 request.spreadsheet_token
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 WriteImagesRequest {
41 #[serde(skip)]
42 api_request: ApiRequest,
43 spreadsheet_token: String,
45 #[serde(rename = "valueRange")]
47 value_range: ImageValueRange,
48}
49
50impl WriteImagesRequest {
51 pub fn builder() -> WriteImagesRequestBuilder {
52 WriteImagesRequestBuilder::default()
53 }
54}
55
56#[derive(Default)]
57pub struct WriteImagesRequestBuilder {
58 request: WriteImagesRequest,
59}
60
61impl WriteImagesRequestBuilder {
62 pub fn spreadsheet_token(mut self, spreadsheet_token: impl ToString) -> Self {
63 self.request.spreadsheet_token = spreadsheet_token.to_string();
64 self
65 }
66
67 pub fn range(mut self, range: impl ToString) -> Self {
68 self.request.value_range.range = range.to_string();
69 self
70 }
71
72 pub fn add_image(mut self, image_data: ImageData) -> Self {
73 self.request.value_range.values.push(vec![image_data]);
74 self
75 }
76
77 pub fn images(mut self, images: Vec<Vec<ImageData>>) -> Self {
78 self.request.value_range.values = images;
79 self
80 }
81
82 pub fn build(mut self) -> WriteImagesRequest {
83 self.request.api_request.body = serde_json::to_vec(&self.request).unwrap();
84 self.request
85 }
86}
87
88#[derive(Default, Debug, Serialize, Deserialize)]
90pub struct ImageValueRange {
91 pub range: String,
93 pub values: Vec<Vec<ImageData>>,
95}
96
97#[derive(Debug, Serialize, Deserialize)]
99pub struct ImageData {
100 #[serde(rename = "type")]
102 pub data_type: String,
103 pub image_token: String,
105 pub width: Option<i32>,
107 pub height: Option<i32>,
109}
110
111impl ImageData {
112 pub fn new(image_token: impl ToString) -> Self {
113 Self {
114 data_type: "image".to_string(),
115 image_token: image_token.to_string(),
116 width: None,
117 height: None,
118 }
119 }
120
121 pub fn with_size(mut self, width: i32, height: i32) -> Self {
122 self.width = Some(width);
123 self.height = Some(height);
124 self
125 }
126}
127
128#[derive(Deserialize, Debug)]
130pub struct WriteImagesResponseData {
131 #[serde(rename = "spreadsheetToken")]
133 pub spreadsheet_token: String,
134 #[serde(rename = "tableRange")]
136 pub table_range: String,
137 pub revision: i32,
139 pub updates: WriteImageUpdatesInfo,
141}
142
143impl ApiResponseTrait for WriteImagesResponseData {
144 fn data_format() -> ResponseFormat {
145 ResponseFormat::Data
146 }
147}
148
149impl_executable_builder_owned!(
150 WriteImagesRequestBuilder,
151 DataOperationService,
152 WriteImagesRequest,
153 BaseResponse<WriteImagesResponseData>,
154 write_images
155);
156
157#[derive(Deserialize, Debug)]
159pub struct WriteImageUpdatesInfo {
160 #[serde(rename = "updatedRange")]
162 pub updated_range: String,
163 #[serde(rename = "updatedRows")]
165 pub updated_rows: i32,
166 #[serde(rename = "updatedColumns")]
168 pub updated_columns: i32,
169 #[serde(rename = "updatedCells")]
171 pub updated_cells: i32,
172 #[serde(rename = "updatedImages")]
174 pub updated_images: i32,
175}
176
177#[cfg(test)]
178mod test {
179 use serde_json::json;
180
181 use super::{ImageData, WriteImagesResponseData};
182
183 #[test]
184 fn test_write_images_response() {
185 let json = json!({
186 "spreadsheetToken": "shtcnmBA*****yGehy8",
187 "tableRange": "Sheet1!A1:B2",
188 "revision": 125,
189 "updates": {
190 "updatedRange": "Sheet1!A1:B2",
191 "updatedRows": 2,
192 "updatedColumns": 2,
193 "updatedCells": 4,
194 "updatedImages": 2
195 }
196 });
197
198 let response: WriteImagesResponseData = serde_json::from_value(json).unwrap();
199 assert_eq!(response.spreadsheet_token, "shtcnmBA*****yGehy8");
200 assert_eq!(response.updates.updated_images, 2);
201 }
202
203 #[test]
204 fn test_image_data_creation() {
205 let image =
206 ImageData::new("img_v2_041b9112-02e8-4c12-b2f2-**********g").with_size(200, 150);
207
208 assert_eq!(image.data_type, "image");
209 assert_eq!(image.width, Some(200));
210 assert_eq!(image.height, Some(150));
211 }
212
213 #[test]
214 fn test_image_data_serialization() {
215 let image = ImageData {
216 data_type: "image".to_string(),
217 image_token: "img_v2_041b9112-02e8-4c12-b2f2-**********g".to_string(),
218 width: Some(100),
219 height: Some(80),
220 };
221
222 let json = serde_json::to_value(&image).unwrap();
223 assert_eq!(json["type"], "image");
224 assert_eq!(
225 json["image_token"],
226 "img_v2_041b9112-02e8-4c12-b2f2-**********g"
227 );
228 assert_eq!(json["width"], 100);
229 assert_eq!(json["height"], 80);
230 }
231}