open_lark/service/cloud_docs/sheets/v2/spreadsheet_sheet/
operate_sheets.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{
4    core::{
5        api_req::ApiRequest,
6        api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
7        constants::AccessTokenType,
8        req_option, SDKResult,
9    },
10    impl_executable_builder_owned,
11    service::sheets::v2::{spreadsheet_sheet::UpdateSheetProperty, SpreadsheetSheetService},
12};
13
14#[derive(Serialize, Deserialize, Debug, Default)]
15pub struct OperateSheetsRequest {
16    #[serde(skip)]
17    api_request: ApiRequest,
18    #[serde(skip)]
19    spreadsheet_token: String,
20    /// 支持增加、复制、和删除工作表。一次请求可以同时进行多个操作。
21    requests: Vec<OperateSheetsRequestElem>,
22}
23
24#[derive(Serialize, Deserialize, Debug)]
25/// 表格操作请求元素类型
26///
27/// 定义对表格进行操作的不同请求类型
28pub enum OperateSheetsRequestElem {
29    /// 增加工作表。
30    #[serde(rename = "addSheet")]
31    AddSheet {
32        /// 工作表属性
33        properties: AddSheetProperty,
34    },
35    /// 复制工作表。复制的新工作表位于源工作表索引位置之后。
36    #[serde(rename = "copySheet")]
37    CopySheet {
38        /// 需要复制的工作表资源
39        source: CopySheetSource,
40        /// 新工作表的属性
41        destination: CopySheetDestination,
42    },
43    /// 更新工作表
44    #[serde(rename = "updateSheet")]
45    UpdateSheet {
46        /// 工作表属性
47        properties: UpdateSheetProperty,
48    },
49    /// 删除工作表。
50    #[serde(rename = "deleteSheet")]
51    DeleteSheet {
52        /// 要删除的工作表的 ID。调用获取工作表获取 ID
53        #[serde(rename = "sheetId")]
54        sheet_id: String,
55    },
56}
57
58/// 工作表属性
59#[derive(Serialize, Deserialize, Debug, Default)]
60pub struct AddSheetProperty {
61    /// 新增工作表的标题
62    pub title: String,
63    /// 新增工作表的位置。不填默认在工作表的第 0 索引位置增加工作表。
64    pub index: Option<i32>,
65}
66
67/// 需要复制的工作表资源
68#[derive(Serialize, Deserialize, Debug, Default)]
69pub struct CopySheetSource {
70    /// 源工作表的 ID。调用获取工作表获取 ID
71    #[serde(rename = "sheetId")]
72    sheet_id: String,
73}
74
75/// 新工作表的属性
76#[derive(Serialize, Deserialize, Debug, Default)]
77pub struct CopySheetDestination {
78    /// 新工作表名称。不填默认为“源工作表名称”+“(副本_源工作表的 index 值)”,如 “Sheet1(副本_0)”。
79    title: Option<String>,
80}
81
82impl OperateSheetsRequest {
83    pub fn builder() -> OperateSheetsRequestBuilder {
84        OperateSheetsRequestBuilder::default()
85    }
86}
87
88#[derive(Default)]
89pub struct OperateSheetsRequestBuilder {
90    request: OperateSheetsRequest,
91}
92
93impl OperateSheetsRequestBuilder {
94    pub fn spreadsheet_token(mut self, spreadsheet_token: impl ToString) -> Self {
95        self.request.spreadsheet_token = spreadsheet_token.to_string();
96        self
97    }
98
99    /// 增加工作表。
100    pub fn add_sheet(mut self, title: impl ToString, index: Option<i32>) -> Self {
101        self.request
102            .requests
103            .push(OperateSheetsRequestElem::AddSheet {
104                properties: AddSheetProperty {
105                    title: title.to_string(),
106                    index,
107                },
108            });
109        self
110    }
111
112    /// 复制工作表。复制的新工作表位于源工作表索引位置之后。
113    pub fn copy_sheet(mut self, source: impl ToString, destination: Option<String>) -> Self {
114        self.request
115            .requests
116            .push(OperateSheetsRequestElem::CopySheet {
117                source: CopySheetSource {
118                    sheet_id: source.to_string(),
119                },
120                destination: CopySheetDestination { title: destination },
121            });
122        self
123    }
124
125    /// 删除工作表。
126    pub fn delete_sheet(mut self, sheet_id: impl ToString) -> Self {
127        self.request
128            .requests
129            .push(OperateSheetsRequestElem::DeleteSheet {
130                sheet_id: sheet_id.to_string(),
131            });
132        self
133    }
134
135    pub fn build(mut self) -> OperateSheetsRequest {
136        self.request.api_request.body = serde_json::to_vec(&self.request).unwrap();
137        self.request
138    }
139}
140
141impl_executable_builder_owned!(
142    OperateSheetsRequestBuilder,
143    SpreadsheetSheetService,
144    OperateSheetsRequest,
145    BaseResponse<OperateSheetResponse>,
146    operate
147);
148
149impl SpreadsheetSheetService {
150    /// 操作工作表
151    /// 新增、复制、删除工作表。
152    pub async fn operate(
153        &self,
154        request: OperateSheetsRequest,
155        option: Option<req_option::RequestOption>,
156    ) -> SDKResult<BaseResponse<OperateSheetResponse>> {
157        let mut api_req = request.api_request;
158        api_req.api_path = format!(
159            "/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/sheets_batch_update",
160            spreadsheet_token = request.spreadsheet_token
161        );
162        api_req.http_method = reqwest::Method::POST;
163        api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
164
165        let api_resp = crate::core::http::Transport::request(api_req, &self.config, option).await?;
166
167        Ok(api_resp)
168    }
169}
170
171#[derive(Deserialize, Debug)]
172pub struct OperateSheetResponse {
173    pub replies: Vec<OperateSheetReply>,
174}
175
176impl ApiResponseTrait for OperateSheetResponse {
177    fn data_format() -> ResponseFormat {
178        ResponseFormat::Data
179    }
180}
181
182#[derive(Deserialize, Debug)]
183/// 表格操作响应类型
184///
185/// 定义表格操作请求的响应结果类型
186pub enum OperateSheetReply {
187    /// 新增工作表的属性
188    #[serde(rename = "addSheet")]
189    AddSheet { properties: SheetResponse },
190    /// 复制工作表的结果
191    #[serde(rename = "copySheet")]
192    CopySheet { properties: SheetResponse },
193    /// 更新工作表的结果
194    #[serde(rename = "updateSheet")]
195    UpdateSheet { properties: UpdateSheetProperty },
196    /// 删除工作表的结果
197    #[serde(rename = "deleteSheet")]
198    DeleteSheet {
199        /// 删除工作表是否成功
200        result: bool,
201        /// 被删除的工作表的 ID
202        #[serde(rename = "sheetId")]
203        sheet_id: String,
204    },
205}
206
207#[derive(Deserialize, Debug)]
208/// 工作表的属性
209pub struct SheetResponse {
210    /// 工作表的 sheetId
211    #[serde(rename = "sheetId")]
212    pub sheet_id: String,
213    /// 工作表的标题
214    pub title: String,
215    /// 工作表的位置
216    pub index: Option<i32>,
217}