Skip to main content

openlark_docs/common/api_endpoints/
sheets.rs

1//! Sheets API 端点目录。
2
3use super::CatalogEndpoint;
4use openlark_core::api::{ApiRequest, HttpMethod};
5
6/// CCM Sheet API Old V2 端点枚举
7/// 对应 meta.project = ccm_sheet, meta.version = old
8#[derive(Debug, Clone, PartialEq)]
9#[cfg_attr(test, derive(strum_macros::EnumIter))]
10pub enum CcmSheetApiOld {
11    /// 操作工作表 (第一个)
12    OperateSheets(String), // spreadsheet_token
13    /// 更新工作表属性 (第二个)
14    UpdateSheetProperties(String), // spreadsheet_token
15    /// 增加行列
16    DimensionRange(String), // spreadsheet_token
17    /// 插入行列
18    InsertDimensionRange(String), // spreadsheet_token
19    /// 更新行列
20    DimensionRangeUpdate(String), // spreadsheet_token
21    /// 删除行列
22    DimensionRangeDelete(String), // spreadsheet_token
23    /// 合并单元格
24    MergeCells(String), // spreadsheet_token
25    /// 拆分单元格
26    UnmergeCells(String), // spreadsheet_token
27    /// 设置单元格样式
28    Style(String), // spreadsheet_token
29    /// 批量设置单元格样式
30    StylesBatchUpdate(String), // spreadsheet_token
31    /// 插入数据
32    ValuesPrepend(String), // spreadsheet_token
33    /// 追加数据
34    ValuesAppend(String), // spreadsheet_token
35    /// 写入图片
36    ValuesImage(String), // spreadsheet_token
37    /// 读取单个范围
38    ValuesRange(String, String), // spreadsheet_token, range
39    /// 读取多个范围
40    ValuesBatchGet(String), // spreadsheet_token
41    /// 向单个范围写入数据
42    Values(String), // spreadsheet_token
43    /// 向多个范围写入数据
44    ValuesBatchUpdate(String), // spreadsheet_token
45    /// 增加保护范围
46    ProtectedDimension(String), // spreadsheet_token
47    /// 修改保护范围
48    ProtectedRangeBatchUpdate(String), // spreadsheet_token
49    /// 获取保护范围
50    ProtectedRangeBatchGet(String), // spreadsheet_token
51    /// 删除保护范围
52    ProtectedRangeBatchDel(String), // spreadsheet_token
53    /// 获取表格元数据
54    Metainfo(String), // spreadsheet_token
55    /// 更新表格属性
56    Properties(String), // spreadsheet_token
57    /// 导入表格
58    Import,
59    /// 查询导入结果
60    ImportResult,
61    /// 获取条件格式
62    ConditionFormats(String), // spreadsheet_token
63    /// 批量创建条件格式
64    ConditionFormatsBatchCreate(String), // spreadsheet_token
65    /// 批量删除条件格式
66    ConditionFormatsBatchDelete(String), // spreadsheet_token
67    /// 批量更新条件格式
68    ConditionFormatsBatchUpdate(String), // spreadsheet_token
69    /// 获取数据验证规则
70    DataValidation(String), // spreadsheet_token
71    /// 创建数据验证规则
72    DataValidationCreate(String), // spreadsheet_token
73    /// 更新下拉列表设置(PUT)
74    DataValidationUpdate(String, String), // spreadsheet_token, sheet_id
75    /// 删除下拉列表设置(DELETE,按 range 删除)
76    DataValidationDelete(String), // spreadsheet_token
77    /// 读取单个范围
78    ReadSingleRange(String, String), // spreadsheet_token, range
79    /// 读取多个范围
80    ReadMultipleRanges(String), // spreadsheet_token
81    /// 写入单个范围
82    WriteSingleRange(String), // spreadsheet_token
83    /// 批量写入范围
84    BatchWriteRanges(String), // spreadsheet_token
85    /// 追加数据
86    AppendValues(String), // spreadsheet_token
87    /// 插入数据
88    InsertValues(String), // spreadsheet_token
89    /// 获取电子表格信息
90    GetSpreadsheet(String), // spreadsheet_token
91    /// 创建电子表格
92    CreateSpreadsheet,
93    /// 修改电子表格属性
94    UpdateSpreadsheet(String), // spreadsheet_token
95    /// 操作工作表
96    AddSheet(String), // spreadsheet_token
97    /// 查询工作表
98    GetSheet(String, String), // spreadsheet_token, sheet_id
99    /// 更新工作表
100    UpdateSheet(String), // spreadsheet_token
101    /// 删除工作表
102    DeleteSheet(String), // spreadsheet_token
103    /// 创建筛选 (V3)
104    CreateFilter(String), // spreadsheet_token
105    /// 获取筛选 (V3)
106    GetFilter(String), // spreadsheet_token
107    /// 更新筛选 (V3)
108    UpdateFilter(String), // spreadsheet_token
109    /// 删除筛选 (V3)
110    DeleteFilter(String), // spreadsheet_token
111    /// 创建筛选视图 (V3)
112    CreateFilterView(String, String), // spreadsheet_token, sheet_id
113    /// 更新筛选视图 (V3)
114    UpdateFilterView(String, String, String), // spreadsheet_token, sheet_id, filter_view_id
115    /// 查询筛选视图 (V3)
116    QueryFilterViews(String, String), // spreadsheet_token, sheet_id
117    /// 获取筛选视图 (V3)
118    GetFilterView(String, String, String), // spreadsheet_token, sheet_id, filter_view_id
119    /// 删除筛选视图 (V3)
120    DeleteFilterView(String, String, String), // spreadsheet_token, sheet_id, filter_view_id
121    /// 创建筛选条件 (V3)
122    CreateFilterCondition(String, String, String), // spreadsheet_token, sheet_id, filter_view_id
123    /// 更新筛选条件 (V3)
124    UpdateFilterCondition(String, String, String, String), // spreadsheet_token, sheet_id, filter_view_id, condition_id
125    /// 查询筛选条件 (V3)
126    QueryFilterConditions(String, String, String), // spreadsheet_token, sheet_id, filter_view_id
127    /// 获取筛选条件 (V3)
128    GetFilterCondition(String, String, String, String), // spreadsheet_token, sheet_id, filter_view_id, condition_id
129    /// 删除筛选条件 (V3)
130    DeleteFilterCondition(String, String, String, String), // spreadsheet_token, sheet_id, filter_view_id, condition_id
131    /// 创建浮动图片 (V3)
132    CreateFloatImage(String, String), // spreadsheet_token, sheet_id
133    /// 更新浮动图片 (V3)
134    UpdateFloatImage(String, String, String), // spreadsheet_token, sheet_id, float_image_id
135    /// 获取浮动图片 (V3)
136    GetFloatImage(String, String, String), // spreadsheet_token, sheet_id, float_image_id
137    /// 查询浮动图片 (V3)
138    QueryFloatImages(String, String), // spreadsheet_token, sheet_id
139    /// 删除浮动图片 (V3)
140    DeleteFloatImage(String, String, String), // spreadsheet_token, sheet_id, float_image_id
141    /// 删除范围 (V3)
142    DeleteRange(String), // spreadsheet_token
143    /// 插入维度 (V3)
144    InsertDimension(String), // spreadsheet_token
145    /// 移动维度 (V3)
146    MoveDimension(String), // spreadsheet_token
147    /// 替换范围 (V3)
148    ReplaceRange(String), // spreadsheet_token
149    /// 查找替换 (V3)
150    FindReplace(String), // spreadsheet_token
151}
152
153impl CcmSheetApiOld {
154    /// 生成对应的 URL
155    pub fn to_url(&self) -> String {
156        match self {
157            CcmSheetApiOld::OperateSheets(spreadsheet_token) => {
158                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/sheets_batch_update")
159            }
160            CcmSheetApiOld::UpdateSheetProperties(spreadsheet_token) => {
161                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/sheets_batch_update")
162            }
163            CcmSheetApiOld::Style(spreadsheet_token) => {
164                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/style")
165            }
166            CcmSheetApiOld::StylesBatchUpdate(spreadsheet_token) => {
167                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/styles_batch_update")
168            }
169            CcmSheetApiOld::ValuesPrepend(spreadsheet_token) => {
170                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values_prepend")
171            }
172            CcmSheetApiOld::ValuesAppend(spreadsheet_token) => {
173                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values_append")
174            }
175            CcmSheetApiOld::ValuesImage(spreadsheet_token) => {
176                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values_image")
177            }
178            CcmSheetApiOld::ValuesRange(spreadsheet_token, range) => {
179                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values/{range}")
180            }
181            CcmSheetApiOld::ValuesBatchGet(spreadsheet_token) => {
182                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values_batch_get")
183            }
184            CcmSheetApiOld::Values(spreadsheet_token) => {
185                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values")
186            }
187            CcmSheetApiOld::ValuesBatchUpdate(spreadsheet_token) => {
188                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values_batch_update")
189            }
190            CcmSheetApiOld::DimensionRange(spreadsheet_token) => {
191                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/dimension_range")
192            }
193            CcmSheetApiOld::InsertDimensionRange(spreadsheet_token) => {
194                format!(
195                    "/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/insert_dimension_range"
196                )
197            }
198            CcmSheetApiOld::DimensionRangeUpdate(spreadsheet_token) => {
199                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/dimension_range")
200            }
201            CcmSheetApiOld::DimensionRangeDelete(spreadsheet_token) => {
202                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/dimension_range")
203            }
204            CcmSheetApiOld::MergeCells(spreadsheet_token) => {
205                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/merge_cells")
206            }
207            CcmSheetApiOld::UnmergeCells(spreadsheet_token) => {
208                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/unmerge_cells")
209            }
210            CcmSheetApiOld::ProtectedDimension(spreadsheet_token) => {
211                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/protected_dimension")
212            }
213            CcmSheetApiOld::ProtectedRangeBatchUpdate(spreadsheet_token) => {
214                format!(
215                    "/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/protected_range_batch_update"
216                )
217            }
218            CcmSheetApiOld::ProtectedRangeBatchGet(spreadsheet_token) => {
219                format!(
220                    "/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/protected_range_batch_get"
221                )
222            }
223            CcmSheetApiOld::ProtectedRangeBatchDel(spreadsheet_token) => {
224                format!(
225                    "/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/protected_range_batch_del"
226                )
227            }
228            CcmSheetApiOld::Metainfo(spreadsheet_token) => {
229                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/metainfo")
230            }
231            CcmSheetApiOld::Properties(spreadsheet_token) => {
232                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/properties")
233            }
234            CcmSheetApiOld::Import => "/open-apis/sheets/v2/import".to_string(),
235            CcmSheetApiOld::ImportResult => "/open-apis/sheets/v2/import/result".to_string(),
236            CcmSheetApiOld::ConditionFormats(spreadsheet_token) => {
237                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/condition_formats")
238            }
239            CcmSheetApiOld::ConditionFormatsBatchCreate(spreadsheet_token) => {
240                format!(
241                    "/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/condition_formats/batch_create"
242                )
243            }
244            CcmSheetApiOld::ConditionFormatsBatchDelete(spreadsheet_token) => {
245                format!(
246                    "/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/condition_formats/batch_delete"
247                )
248            }
249            CcmSheetApiOld::ConditionFormatsBatchUpdate(spreadsheet_token) => {
250                format!(
251                    "/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/condition_formats/batch_update"
252                )
253            }
254            CcmSheetApiOld::DataValidation(spreadsheet_token) => {
255                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/dataValidation")
256            }
257            CcmSheetApiOld::DataValidationCreate(spreadsheet_token) => {
258                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/dataValidation")
259            }
260            CcmSheetApiOld::DataValidationUpdate(spreadsheet_token, sheet_id) => {
261                format!(
262                    "/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/dataValidation/{sheet_id}"
263                )
264            }
265            CcmSheetApiOld::DataValidationDelete(spreadsheet_token) => {
266                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/dataValidation")
267            }
268            CcmSheetApiOld::ReadSingleRange(spreadsheet_token, range) => {
269                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values/{range}")
270            }
271            CcmSheetApiOld::ReadMultipleRanges(spreadsheet_token) => {
272                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values_batch_get")
273            }
274            CcmSheetApiOld::WriteSingleRange(spreadsheet_token) => {
275                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values")
276            }
277            CcmSheetApiOld::BatchWriteRanges(spreadsheet_token) => {
278                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values_batch_update")
279            }
280            CcmSheetApiOld::AppendValues(spreadsheet_token) => {
281                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values_append")
282            }
283            CcmSheetApiOld::InsertValues(spreadsheet_token) => {
284                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values_prepend")
285            }
286            CcmSheetApiOld::GetSpreadsheet(spreadsheet_token) => {
287                format!("/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}")
288            }
289            CcmSheetApiOld::CreateSpreadsheet => "/open-apis/sheets/v3/spreadsheets".to_string(),
290            CcmSheetApiOld::UpdateSpreadsheet(spreadsheet_token) => {
291                format!("/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}")
292            }
293            CcmSheetApiOld::AddSheet(spreadsheet_token) => {
294                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/sheets_batch_update")
295            }
296            CcmSheetApiOld::GetSheet(spreadsheet_token, sheet_id) => {
297                format!("/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}")
298            }
299            CcmSheetApiOld::UpdateSheet(spreadsheet_token) => {
300                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/sheets_batch_update")
301            }
302            CcmSheetApiOld::DeleteSheet(spreadsheet_token) => {
303                format!("/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/sheets_batch_update")
304            }
305            CcmSheetApiOld::CreateFilter(spreadsheet_token) => {
306                format!("/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/filterViews")
307            }
308            CcmSheetApiOld::GetFilter(spreadsheet_token) => {
309                format!("/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/filterViews/query")
310            }
311            CcmSheetApiOld::UpdateFilter(spreadsheet_token) => {
312                format!("/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/filterViews")
313            }
314            CcmSheetApiOld::DeleteFilter(spreadsheet_token) => {
315                format!("/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/filterViews")
316            }
317            CcmSheetApiOld::CreateFilterView(spreadsheet_token, sheet_id) => {
318                format!(
319                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views"
320                )
321            }
322            CcmSheetApiOld::UpdateFilterView(spreadsheet_token, sheet_id, filter_view_id) => {
323                format!(
324                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/{filter_view_id}"
325                )
326            }
327            CcmSheetApiOld::QueryFilterViews(spreadsheet_token, sheet_id) => {
328                format!(
329                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/query"
330                )
331            }
332            CcmSheetApiOld::GetFilterView(spreadsheet_token, sheet_id, filter_view_id) => {
333                format!(
334                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/{filter_view_id}"
335                )
336            }
337            CcmSheetApiOld::DeleteFilterView(spreadsheet_token, sheet_id, filter_view_id) => {
338                format!(
339                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/{filter_view_id}"
340                )
341            }
342            CcmSheetApiOld::CreateFilterCondition(spreadsheet_token, sheet_id, filter_view_id) => {
343                format!(
344                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/{filter_view_id}/conditions"
345                )
346            }
347            CcmSheetApiOld::UpdateFilterCondition(
348                spreadsheet_token,
349                sheet_id,
350                filter_view_id,
351                condition_id,
352            ) => {
353                format!(
354                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/{filter_view_id}/conditions/{condition_id}"
355                )
356            }
357            CcmSheetApiOld::QueryFilterConditions(spreadsheet_token, sheet_id, filter_view_id) => {
358                format!(
359                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/{filter_view_id}/conditions/query"
360                )
361            }
362            CcmSheetApiOld::GetFilterCondition(
363                spreadsheet_token,
364                sheet_id,
365                filter_view_id,
366                condition_id,
367            ) => {
368                format!(
369                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/{filter_view_id}/conditions/{condition_id}"
370                )
371            }
372            CcmSheetApiOld::DeleteFilterCondition(
373                spreadsheet_token,
374                sheet_id,
375                filter_view_id,
376                condition_id,
377            ) => {
378                format!(
379                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/{filter_view_id}/conditions/{condition_id}"
380                )
381            }
382            CcmSheetApiOld::CreateFloatImage(spreadsheet_token, sheet_id) => {
383                format!(
384                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/float_images"
385                )
386            }
387            CcmSheetApiOld::UpdateFloatImage(spreadsheet_token, sheet_id, float_image_id) => {
388                format!(
389                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/float_images/{float_image_id}"
390                )
391            }
392            CcmSheetApiOld::GetFloatImage(spreadsheet_token, sheet_id, float_image_id) => {
393                format!(
394                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/float_images/{float_image_id}"
395                )
396            }
397            CcmSheetApiOld::QueryFloatImages(spreadsheet_token, sheet_id) => {
398                format!(
399                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/float_images/query"
400                )
401            }
402            CcmSheetApiOld::DeleteFloatImage(spreadsheet_token, sheet_id, float_image_id) => {
403                format!(
404                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/float_images/{float_image_id}"
405                )
406            }
407            CcmSheetApiOld::DeleteRange(spreadsheet_token) => {
408                format!(
409                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/dimensionRange/delete"
410                )
411            }
412            CcmSheetApiOld::InsertDimension(spreadsheet_token) => {
413                format!(
414                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/dimensionRange/insert"
415                )
416            }
417            CcmSheetApiOld::MoveDimension(spreadsheet_token) => {
418                format!("/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/dimensionRange/move")
419            }
420            CcmSheetApiOld::ReplaceRange(spreadsheet_token) => {
421                format!("/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/values/batchReplace")
422            }
423            CcmSheetApiOld::FindReplace(spreadsheet_token) => {
424                format!(
425                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/values/batchFindReplace"
426                )
427            }
428        }
429    }
430
431    /// 返回配置了稳定请求语义的请求。
432    pub fn to_request<R>(&self) -> ApiRequest<R> {
433        <Self as CatalogEndpoint>::to_request(self)
434    }
435}
436
437impl CatalogEndpoint for CcmSheetApiOld {
438    fn to_url(&self) -> String {
439        CcmSheetApiOld::to_url(self)
440    }
441
442    /// 返回端点的 HTTP 方法,并保持旧版 leaf 的现有请求语义。
443    fn method(&self) -> HttpMethod {
444        match self {
445            Self::ValuesRange(_, _)
446            | Self::ValuesBatchGet(_)
447            | Self::ProtectedRangeBatchGet(_)
448            | Self::Metainfo(_)
449            | Self::ImportResult
450            | Self::ConditionFormats(_)
451            | Self::DataValidation(_)
452            | Self::ReadSingleRange(_, _)
453            | Self::ReadMultipleRanges(_)
454            | Self::GetSpreadsheet(_)
455            | Self::GetSheet(_, _)
456            | Self::QueryFilterViews(_, _)
457            | Self::GetFilterView(_, _, _)
458            | Self::QueryFilterConditions(_, _, _)
459            | Self::GetFilterCondition(_, _, _, _)
460            | Self::QueryFloatImages(_, _) => HttpMethod::Get,
461            Self::Values(_)
462            | Self::WriteSingleRange(_)
463            | Self::DataValidationUpdate(_, _)
464            | Self::DimensionRangeUpdate(_)
465            | Self::Properties(_) => HttpMethod::Put,
466            Self::UpdateSpreadsheet(_) | Self::UpdateFilterView(_, _, _) => HttpMethod::Patch,
467            Self::DimensionRangeDelete(_)
468            | Self::DataValidationDelete(_)
469            | Self::DeleteFilterView(_, _, _)
470            | Self::DeleteFilterCondition(_, _, _, _) => HttpMethod::Delete,
471            Self::OperateSheets(_)
472            | Self::UpdateSheetProperties(_)
473            | Self::DimensionRange(_)
474            | Self::InsertDimensionRange(_)
475            | Self::MergeCells(_)
476            | Self::UnmergeCells(_)
477            | Self::Style(_)
478            | Self::StylesBatchUpdate(_)
479            | Self::ValuesPrepend(_)
480            | Self::ValuesAppend(_)
481            | Self::ValuesImage(_)
482            | Self::ValuesBatchUpdate(_)
483            | Self::ProtectedDimension(_)
484            | Self::ProtectedRangeBatchUpdate(_)
485            | Self::ProtectedRangeBatchDel(_)
486            | Self::Import
487            | Self::ConditionFormatsBatchCreate(_)
488            | Self::ConditionFormatsBatchDelete(_)
489            | Self::ConditionFormatsBatchUpdate(_)
490            | Self::DataValidationCreate(_)
491            | Self::BatchWriteRanges(_)
492            | Self::AppendValues(_)
493            | Self::InsertValues(_)
494            | Self::CreateSpreadsheet
495            | Self::AddSheet(_)
496            | Self::UpdateSheet(_)
497            | Self::DeleteSheet(_)
498            | Self::CreateFilter(_)
499            | Self::GetFilter(_)
500            | Self::UpdateFilter(_)
501            | Self::DeleteFilter(_)
502            | Self::CreateFilterView(_, _)
503            | Self::CreateFilterCondition(_, _, _)
504            | Self::UpdateFilterCondition(_, _, _, _)
505            | Self::CreateFloatImage(_, _)
506            | Self::UpdateFloatImage(_, _, _)
507            | Self::GetFloatImage(_, _, _)
508            | Self::DeleteFloatImage(_, _, _)
509            | Self::DeleteRange(_)
510            | Self::InsertDimension(_)
511            | Self::MoveDimension(_)
512            | Self::ReplaceRange(_)
513            | Self::FindReplace(_) => HttpMethod::Post,
514        }
515    }
516}
517
518/// Sheets API v3 端点枚举
519/// 对应 meta.project = sheets, meta.version = v3
520#[derive(Debug, Clone, PartialEq)]
521#[cfg_attr(test, derive(strum_macros::EnumIter))]
522pub enum SheetsApiV3 {
523    // =====================
524    // spreadsheet
525    // =====================
526    /// 创建电子表格
527    CreateSpreadsheet,
528    /// 获取电子表格信息
529    GetSpreadsheet(String), // spreadsheet_token
530    /// 修改电子表格属性
531    PatchSpreadsheet(String), // spreadsheet_token
532
533    // =====================
534    // spreadsheet.sheet
535    // =====================
536    /// 获取工作表列表
537    QuerySheets(String), // spreadsheet_token
538    /// 查询工作表
539    GetSheet(String, String), // (spreadsheet_token, sheet_id)
540    /// 移动行列
541    MoveDimension(String, String), // (spreadsheet_token, sheet_id)
542    /// 查找单元格
543    FindCells(String, String), // (spreadsheet_token, sheet_id)
544    /// 替换单元格
545    ReplaceCells(String, String), // (spreadsheet_token, sheet_id)
546
547    // =====================
548    // spreadsheet.sheet.filter
549    // =====================
550    /// 创建筛选
551    CreateFilter(String, String), // (spreadsheet_token, sheet_id)
552    /// 更新筛选
553    UpdateFilter(String, String), // (spreadsheet_token, sheet_id)
554    /// 获取筛选
555    GetFilter(String, String), // (spreadsheet_token, sheet_id)
556    /// 删除筛选
557    DeleteFilter(String, String), // (spreadsheet_token, sheet_id)
558
559    // =====================
560    // spreadsheet.sheet.filter_view
561    // =====================
562    /// 创建筛选视图
563    CreateFilterView(String, String), // (spreadsheet_token, sheet_id)
564    /// 查询筛选视图
565    QueryFilterViews(String, String), // (spreadsheet_token, sheet_id)
566    /// 获取筛选视图
567    GetFilterView(String, String, String), // (spreadsheet_token, sheet_id, filter_view_id)
568    /// 更新筛选视图
569    PatchFilterView(String, String, String), // (spreadsheet_token, sheet_id, filter_view_id)
570    /// 删除筛选视图
571    DeleteFilterView(String, String, String), // (spreadsheet_token, sheet_id, filter_view_id)
572
573    // =====================
574    // spreadsheet.sheet.filter_view.condition
575    // =====================
576    /// 创建筛选条件
577    CreateFilterCondition(String, String, String), // (spreadsheet_token, sheet_id, filter_view_id)
578    /// 查询筛选条件
579    QueryFilterConditions(String, String, String), // (spreadsheet_token, sheet_id, filter_view_id)
580    /// 获取筛选条件
581    GetFilterCondition(String, String, String, String), // (spreadsheet_token, sheet_id, filter_view_id, condition_id)
582    /// 更新筛选条件
583    UpdateFilterCondition(String, String, String, String), // (spreadsheet_token, sheet_id, filter_view_id, condition_id)
584    /// 删除筛选条件
585    DeleteFilterCondition(String, String, String, String), // (spreadsheet_token, sheet_id, filter_view_id, condition_id)
586
587    // =====================
588    // spreadsheet.sheet.float_image
589    // =====================
590    /// 创建浮动图片
591    CreateFloatImage(String, String), // (spreadsheet_token, sheet_id)
592    /// 查询浮动图片
593    QueryFloatImages(String, String), // (spreadsheet_token, sheet_id)
594    /// 获取浮动图片
595    GetFloatImage(String, String, String), // (spreadsheet_token, sheet_id, float_image_id)
596    /// 更新浮动图片
597    PatchFloatImage(String, String, String), // (spreadsheet_token, sheet_id, float_image_id)
598    /// 删除浮动图片
599    DeleteFloatImage(String, String, String), // (spreadsheet_token, sheet_id, float_image_id)
600}
601
602impl SheetsApiV3 {
603    /// 生成对应的 URL
604    pub fn to_url(&self) -> String {
605        match self {
606            SheetsApiV3::CreateSpreadsheet => "/open-apis/sheets/v3/spreadsheets".to_string(),
607            SheetsApiV3::GetSpreadsheet(spreadsheet_token) => {
608                format!("/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}")
609            }
610            SheetsApiV3::PatchSpreadsheet(spreadsheet_token) => {
611                format!("/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}")
612            }
613
614            SheetsApiV3::QuerySheets(spreadsheet_token) => {
615                format!("/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/query")
616            }
617            SheetsApiV3::GetSheet(spreadsheet_token, sheet_id) => {
618                format!("/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}")
619            }
620            SheetsApiV3::MoveDimension(spreadsheet_token, sheet_id) => format!(
621                "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/move_dimension"
622            ),
623            SheetsApiV3::FindCells(spreadsheet_token, sheet_id) => format!(
624                "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/find"
625            ),
626            SheetsApiV3::ReplaceCells(spreadsheet_token, sheet_id) => format!(
627                "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/replace"
628            ),
629
630            SheetsApiV3::CreateFilter(spreadsheet_token, sheet_id)
631            | SheetsApiV3::UpdateFilter(spreadsheet_token, sheet_id)
632            | SheetsApiV3::GetFilter(spreadsheet_token, sheet_id)
633            | SheetsApiV3::DeleteFilter(spreadsheet_token, sheet_id) => format!(
634                "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter"
635            ),
636
637            SheetsApiV3::CreateFilterView(spreadsheet_token, sheet_id) => format!(
638                "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views"
639            ),
640            SheetsApiV3::QueryFilterViews(spreadsheet_token, sheet_id) => format!(
641                "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/query"
642            ),
643            SheetsApiV3::GetFilterView(spreadsheet_token, sheet_id, filter_view_id)
644            | SheetsApiV3::PatchFilterView(spreadsheet_token, sheet_id, filter_view_id)
645            | SheetsApiV3::DeleteFilterView(spreadsheet_token, sheet_id, filter_view_id) => {
646                format!(
647                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/{filter_view_id}"
648                )
649            }
650
651            SheetsApiV3::CreateFilterCondition(spreadsheet_token, sheet_id, filter_view_id) => {
652                format!(
653                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/{filter_view_id}/conditions"
654                )
655            }
656            SheetsApiV3::QueryFilterConditions(spreadsheet_token, sheet_id, filter_view_id) => {
657                format!(
658                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/{filter_view_id}/conditions/query"
659                )
660            }
661            SheetsApiV3::GetFilterCondition(
662                spreadsheet_token,
663                sheet_id,
664                filter_view_id,
665                condition_id,
666            )
667            | SheetsApiV3::UpdateFilterCondition(
668                spreadsheet_token,
669                sheet_id,
670                filter_view_id,
671                condition_id,
672            )
673            | SheetsApiV3::DeleteFilterCondition(
674                spreadsheet_token,
675                sheet_id,
676                filter_view_id,
677                condition_id,
678            ) => format!(
679                "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/filter_views/{filter_view_id}/conditions/{condition_id}"
680            ),
681
682            SheetsApiV3::CreateFloatImage(spreadsheet_token, sheet_id) => format!(
683                "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/float_images"
684            ),
685            SheetsApiV3::QueryFloatImages(spreadsheet_token, sheet_id) => format!(
686                "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/float_images/query"
687            ),
688            SheetsApiV3::GetFloatImage(spreadsheet_token, sheet_id, float_image_id)
689            | SheetsApiV3::PatchFloatImage(spreadsheet_token, sheet_id, float_image_id)
690            | SheetsApiV3::DeleteFloatImage(spreadsheet_token, sheet_id, float_image_id) => {
691                format!(
692                    "/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/{sheet_id}/float_images/{float_image_id}"
693                )
694            }
695        }
696    }
697
698    /// 返回配置了稳定请求语义的请求。
699    pub fn to_request<R>(&self) -> ApiRequest<R> {
700        <Self as CatalogEndpoint>::to_request(self)
701    }
702}
703
704impl CatalogEndpoint for SheetsApiV3 {
705    fn to_url(&self) -> String {
706        SheetsApiV3::to_url(self)
707    }
708
709    fn method(&self) -> HttpMethod {
710        match self {
711            Self::GetSpreadsheet(_)
712            | Self::QuerySheets(_)
713            | Self::GetSheet(_, _)
714            | Self::GetFilter(_, _)
715            | Self::QueryFilterViews(_, _)
716            | Self::GetFilterView(_, _, _)
717            | Self::QueryFilterConditions(_, _, _)
718            | Self::GetFilterCondition(_, _, _, _)
719            | Self::QueryFloatImages(_, _)
720            | Self::GetFloatImage(_, _, _) => HttpMethod::Get,
721            Self::CreateSpreadsheet
722            | Self::CreateFilter(_, _)
723            | Self::CreateFilterView(_, _)
724            | Self::CreateFilterCondition(_, _, _)
725            | Self::CreateFloatImage(_, _) => HttpMethod::Post,
726            Self::MoveDimension(_, _) | Self::FindCells(_, _) | Self::ReplaceCells(_, _) => {
727                HttpMethod::Post
728            }
729            Self::PatchSpreadsheet(_)
730            | Self::PatchFilterView(_, _, _)
731            | Self::PatchFloatImage(_, _, _) => HttpMethod::Patch,
732            Self::UpdateFilter(_, _) | Self::UpdateFilterCondition(_, _, _, _) => HttpMethod::Put,
733            Self::DeleteFilter(_, _)
734            | Self::DeleteFilterView(_, _, _)
735            | Self::DeleteFilterCondition(_, _, _, _)
736            | Self::DeleteFloatImage(_, _, _) => HttpMethod::Delete,
737        }
738    }
739
740    // supported_access_token_types 使用 trait 默认实现(User + Tenant)
741}
742
743#[cfg(test)]
744mod tests {
745    use super::*;
746    use crate::common::api_endpoints::test_support::catalog_semantics_snapshot;
747
748    #[test]
749    fn sheets_catalog_semantics_snapshots() {
750        insta::assert_snapshot!(
751            "ccm_sheet_old_catalog_semantics",
752            catalog_semantics_snapshot::<CcmSheetApiOld>()
753        );
754        insta::assert_snapshot!(
755            "sheets_v3_catalog_semantics",
756            catalog_semantics_snapshot::<SheetsApiV3>()
757        );
758    }
759}