Skip to main content

openlark_docs/common/
api_endpoints.rs

1//! API端点定义(类型安全枚举系统)
2//!
3//! 本模块提供基于枚举的 API 端点定义,用于生产代码中的类型安全调用。
4//!
5//! # 使用场景
6//!
7//! ## 生产代码(推荐)
8//! 使用枚举端点获得编译时类型检查和动态 URL 生成能力:
9//! ```rust
10//! use openlark_docs::common::api_endpoints::BitableApiV1;
11//!
12//! let app_token = "app_token".to_string();
13//! let table_id = "table_id".to_string();
14//! let endpoint = BitableApiV1::RecordCreate(app_token, table_id);
15//! let url = endpoint.to_url(); // 类型安全,动态生成
16//! assert!(url.contains("/open-apis/bitable/v1/"));
17//! ```
18//!
19//! # 特性
20//! - ✅ **类型安全**:编译时验证参数
21//! - ✅ **动态生成**:支持参数化 URL
22//! - ✅ **易于维护**:集中管理端点定义
23//! - ✅ **避免错误**:消除字符串拼接错误
24//!
25//! # 与常量端点系统的关系
26//!
27//! 本模块与 `endpoints/mod.rs` 中的常量端点系统配合使用:
28//! - **枚举端点**:用于生产代码(推荐)
29//! - **常量端点**:用于测试和文档示例
30//!
31//! 不建议混合使用两个系统,应根据场景选择合适的端点方式。
32
33/// Base API V2 端点枚举
34#[derive(Debug, Clone, PartialEq)]
35pub enum BaseApiV2 {
36    /// 新增自定义角色
37    RoleCreate(String),
38    /// 更新自定义角色
39    RoleUpdate(String, String),
40    /// 列出自定义角色
41    RoleList(String),
42}
43
44impl BaseApiV2 {
45    /// 生成对应的 URL
46    pub fn to_url(&self) -> String {
47        match self {
48            BaseApiV2::RoleCreate(app_token) => {
49                format!("/open-apis/base/v2/apps/{}/roles", app_token)
50            }
51            BaseApiV2::RoleUpdate(app_token, role_id) => {
52                format!("/open-apis/base/v2/apps/{}/roles/{}", app_token, role_id)
53            }
54            BaseApiV2::RoleList(app_token) => {
55                format!("/open-apis/base/v2/apps/{}/roles", app_token)
56            }
57        }
58    }
59}
60
61/// Bitable API V1 端点枚举
62#[derive(Debug, Clone, PartialEq)]
63pub enum BitableApiV1 {
64    /// App管理相关
65    AppCreate,
66    AppCopy(String),
67    AppGet(String),
68    AppUpdate(String),
69    DashboardList(String),
70    DashboardCopy(String, String),
71    /// 自动化流程
72    BlockWorkflowList(String),
73    WorkflowList(String),
74    WorkflowUpdate(String, String),
75
76    /// 表格管理相关
77    TableCreate(String),
78    TableBatchCreate(String),
79    TableUpdate(String, String),
80    TableDelete(String, String),
81    TableBatchDelete(String),
82    TableGet(String, String),
83    TableList(String),
84    TablePatch(String, String),
85
86    /// 字段管理相关
87    FieldCreate(String, String),
88    FieldGroupCreate(String, String),
89    FieldUpdate(String, String, String),
90    FieldDelete(String, String, String),
91    FieldList(String, String),
92
93    /// 视图管理相关
94    ViewCreate(String, String),
95    ViewUpdate(String, String, String),
96    ViewDelete(String, String, String),
97    ViewGet(String, String, String),
98    ViewList(String, String),
99    ViewPatch(String, String, String),
100
101    /// 记录管理相关
102    RecordCreate(String, String),
103    RecordBatchCreate(String, String),
104    RecordGet(String, String, String),
105    RecordBatchGet(String, String),
106    RecordUpdate(String, String, String),
107    RecordBatchUpdate(String, String),
108    RecordDelete(String, String, String),
109    RecordBatchDelete(String, String),
110    RecordList(String, String),
111    RecordSearch(String, String),
112
113    /// 表单管理相关
114    FormGet(String, String, String),
115    FormPatch(String, String, String),
116    FormUpgrade(String, String, String),
117    FormFieldList(String, String, String),
118    FormFieldPatch(String, String, String, String),
119
120    /// 权限管理相关
121    RoleCreate(String),
122    RoleUpdate(String, String),
123    RoleDelete(String, String),
124    RoleList(String),
125    RoleMemberCreate(String, String),
126    RoleMemberBatchCreate(String, String),
127    RoleMemberDelete(String, String, String),
128    RoleMemberBatchDelete(String, String),
129    RoleMemberList(String, String),
130}
131
132impl BitableApiV1 {
133    /// 生成对应的 URL
134    pub fn to_url(&self) -> String {
135        match self {
136            // App管理
137            BitableApiV1::AppCreate => "/open-apis/bitable/v1/apps".to_string(),
138            BitableApiV1::AppCopy(app_token) => {
139                format!("/open-apis/bitable/v1/apps/{}/copy", app_token)
140            }
141            BitableApiV1::AppGet(app_token) => {
142                format!("/open-apis/bitable/v1/apps/{}", app_token)
143            }
144            BitableApiV1::AppUpdate(app_token) => {
145                format!("/open-apis/bitable/v1/apps/{}", app_token)
146            }
147            BitableApiV1::DashboardList(app_token) => {
148                format!("/open-apis/bitable/v1/apps/{}/dashboards", app_token)
149            }
150            BitableApiV1::DashboardCopy(app_token, block_id) => {
151                format!(
152                    "/open-apis/bitable/v1/apps/{}/dashboards/{}/copy",
153                    app_token, block_id
154                )
155            }
156            BitableApiV1::BlockWorkflowList(app_token) => {
157                format!("/open-apis/bitable/v1/apps/{}/block_workflows", app_token)
158            }
159            BitableApiV1::WorkflowList(app_token) => {
160                format!("/open-apis/bitable/v1/apps/{}/workflows", app_token)
161            }
162            BitableApiV1::WorkflowUpdate(app_token, workflow_id) => {
163                format!(
164                    "/open-apis/bitable/v1/apps/{}/workflows/{}",
165                    app_token, workflow_id
166                )
167            }
168
169            // 表格管理
170            BitableApiV1::TableCreate(app_token) => {
171                format!("/open-apis/bitable/v1/apps/{}/tables", app_token)
172            }
173            BitableApiV1::TableBatchCreate(app_token) => {
174                format!(
175                    "/open-apis/bitable/v1/apps/{}/tables/batch_create",
176                    app_token
177                )
178            }
179            BitableApiV1::TableUpdate(app_token, table_id) => {
180                format!(
181                    "/open-apis/bitable/v1/apps/{}/tables/{}",
182                    app_token, table_id
183                )
184            }
185            BitableApiV1::TableDelete(app_token, table_id) => {
186                format!(
187                    "/open-apis/bitable/v1/apps/{}/tables/{}",
188                    app_token, table_id
189                )
190            }
191            BitableApiV1::TableBatchDelete(app_token) => {
192                format!(
193                    "/open-apis/bitable/v1/apps/{}/tables/batch_delete",
194                    app_token
195                )
196            }
197            BitableApiV1::TableGet(app_token, table_id) => {
198                format!(
199                    "/open-apis/bitable/v1/apps/{}/tables/{}",
200                    app_token, table_id
201                )
202            }
203            BitableApiV1::TableList(app_token) => {
204                format!("/open-apis/bitable/v1/apps/{}/tables", app_token)
205            }
206            BitableApiV1::TablePatch(app_token, table_id) => {
207                format!(
208                    "/open-apis/bitable/v1/apps/{}/tables/{}",
209                    app_token, table_id
210                )
211            }
212
213            // 字段管理
214            BitableApiV1::FieldCreate(app_token, table_id) => {
215                format!(
216                    "/open-apis/bitable/v1/apps/{}/tables/{}/fields",
217                    app_token, table_id
218                )
219            }
220            BitableApiV1::FieldGroupCreate(app_token, table_id) => {
221                format!(
222                    "/open-apis/bitable/v1/apps/{}/tables/{}/field_groups",
223                    app_token, table_id
224                )
225            }
226            BitableApiV1::FieldUpdate(app_token, table_id, field_id) => {
227                format!(
228                    "/open-apis/bitable/v1/apps/{}/tables/{}/fields/{}",
229                    app_token, table_id, field_id
230                )
231            }
232            BitableApiV1::FieldDelete(app_token, table_id, field_id) => {
233                format!(
234                    "/open-apis/bitable/v1/apps/{}/tables/{}/fields/{}",
235                    app_token, table_id, field_id
236                )
237            }
238            BitableApiV1::FieldList(app_token, table_id) => {
239                format!(
240                    "/open-apis/bitable/v1/apps/{}/tables/{}/fields",
241                    app_token, table_id
242                )
243            }
244
245            // 视图管理
246            BitableApiV1::ViewCreate(app_token, table_id) => {
247                format!(
248                    "/open-apis/bitable/v1/apps/{}/tables/{}/views",
249                    app_token, table_id
250                )
251            }
252            BitableApiV1::ViewUpdate(app_token, table_id, view_id) => {
253                format!(
254                    "/open-apis/bitable/v1/apps/{}/tables/{}/views/{}",
255                    app_token, table_id, view_id
256                )
257            }
258            BitableApiV1::ViewDelete(app_token, table_id, view_id) => {
259                format!(
260                    "/open-apis/bitable/v1/apps/{}/tables/{}/views/{}",
261                    app_token, table_id, view_id
262                )
263            }
264            BitableApiV1::ViewGet(app_token, table_id, view_id) => {
265                format!(
266                    "/open-apis/bitable/v1/apps/{}/tables/{}/views/{}",
267                    app_token, table_id, view_id
268                )
269            }
270            BitableApiV1::ViewList(app_token, table_id) => {
271                format!(
272                    "/open-apis/bitable/v1/apps/{}/tables/{}/views",
273                    app_token, table_id
274                )
275            }
276            BitableApiV1::ViewPatch(app_token, table_id, view_id) => {
277                format!(
278                    "/open-apis/bitable/v1/apps/{}/tables/{}/views/{}",
279                    app_token, table_id, view_id
280                )
281            }
282
283            // 记录管理
284            BitableApiV1::RecordCreate(app_token, table_id) => {
285                format!(
286                    "/open-apis/bitable/v1/apps/{}/tables/{}/records",
287                    app_token, table_id
288                )
289            }
290            BitableApiV1::RecordBatchCreate(app_token, table_id) => {
291                format!(
292                    "/open-apis/bitable/v1/apps/{}/tables/{}/records/batch_create",
293                    app_token, table_id
294                )
295            }
296            BitableApiV1::RecordGet(app_token, table_id, record_id) => {
297                format!(
298                    "/open-apis/bitable/v1/apps/{}/tables/{}/records/{}",
299                    app_token, table_id, record_id
300                )
301            }
302            BitableApiV1::RecordBatchGet(app_token, table_id) => {
303                format!(
304                    "/open-apis/bitable/v1/apps/{}/tables/{}/records/batch_get",
305                    app_token, table_id
306                )
307            }
308            BitableApiV1::RecordUpdate(app_token, table_id, record_id) => {
309                format!(
310                    "/open-apis/bitable/v1/apps/{}/tables/{}/records/{}",
311                    app_token, table_id, record_id
312                )
313            }
314            BitableApiV1::RecordBatchUpdate(app_token, table_id) => {
315                format!(
316                    "/open-apis/bitable/v1/apps/{}/tables/{}/records/batch_update",
317                    app_token, table_id
318                )
319            }
320            BitableApiV1::RecordDelete(app_token, table_id, record_id) => {
321                format!(
322                    "/open-apis/bitable/v1/apps/{}/tables/{}/records/{}",
323                    app_token, table_id, record_id
324                )
325            }
326            BitableApiV1::RecordBatchDelete(app_token, table_id) => {
327                format!(
328                    "/open-apis/bitable/v1/apps/{}/tables/{}/records/batch_delete",
329                    app_token, table_id
330                )
331            }
332            BitableApiV1::RecordList(app_token, table_id) => {
333                format!(
334                    "/open-apis/bitable/v1/apps/{}/tables/{}/records",
335                    app_token, table_id
336                )
337            }
338            BitableApiV1::RecordSearch(app_token, table_id) => {
339                format!(
340                    "/open-apis/bitable/v1/apps/{}/tables/{}/records/search",
341                    app_token, table_id
342                )
343            }
344
345            // 表单管理
346            BitableApiV1::FormGet(app_token, table_id, form_id) => {
347                format!(
348                    "/open-apis/bitable/v1/apps/{}/tables/{}/forms/{}",
349                    app_token, table_id, form_id
350                )
351            }
352            BitableApiV1::FormPatch(app_token, table_id, form_id) => {
353                format!(
354                    "/open-apis/bitable/v1/apps/{}/tables/{}/forms/{}",
355                    app_token, table_id, form_id
356                )
357            }
358            BitableApiV1::FormUpgrade(app_token, table_id, form_id) => {
359                format!(
360                    "/open-apis/bitable/v1/apps/{}/tables/{}/forms/{}/upgrade",
361                    app_token, table_id, form_id
362                )
363            }
364            BitableApiV1::FormFieldList(app_token, table_id, form_id) => {
365                format!(
366                    "/open-apis/bitable/v1/apps/{}/tables/{}/forms/{}/fields",
367                    app_token, table_id, form_id
368                )
369            }
370            BitableApiV1::FormFieldPatch(app_token, table_id, form_id, field_id) => {
371                format!(
372                    "/open-apis/bitable/v1/apps/{}/tables/{}/forms/{}/fields/{}",
373                    app_token, table_id, form_id, field_id
374                )
375            }
376
377            // 权限管理
378            BitableApiV1::RoleCreate(app_token) => {
379                format!("/open-apis/bitable/v1/apps/{}/roles", app_token)
380            }
381            BitableApiV1::RoleUpdate(app_token, role_id) => {
382                format!("/open-apis/bitable/v1/apps/{}/roles/{}", app_token, role_id)
383            }
384            BitableApiV1::RoleDelete(app_token, role_id) => {
385                format!("/open-apis/bitable/v1/apps/{}/roles/{}", app_token, role_id)
386            }
387            BitableApiV1::RoleList(app_token) => {
388                format!("/open-apis/bitable/v1/apps/{}/roles", app_token)
389            }
390            BitableApiV1::RoleMemberCreate(app_token, role_id) => {
391                format!(
392                    "/open-apis/bitable/v1/apps/{}/roles/{}/members",
393                    app_token, role_id
394                )
395            }
396            BitableApiV1::RoleMemberBatchCreate(app_token, role_id) => {
397                format!(
398                    "/open-apis/bitable/v1/apps/{}/roles/{}/members/batch_create",
399                    app_token, role_id
400                )
401            }
402            BitableApiV1::RoleMemberDelete(app_token, role_id, member_id) => {
403                format!(
404                    "/open-apis/bitable/v1/apps/{}/roles/{}/members/{}",
405                    app_token, role_id, member_id
406                )
407            }
408            BitableApiV1::RoleMemberBatchDelete(app_token, role_id) => {
409                format!(
410                    "/open-apis/bitable/v1/apps/{}/roles/{}/members/batch_delete",
411                    app_token, role_id
412                )
413            }
414            BitableApiV1::RoleMemberList(app_token, role_id) => {
415                format!(
416                    "/open-apis/bitable/v1/apps/{}/roles/{}/members",
417                    app_token, role_id
418                )
419            }
420        }
421    }
422}
423
424/// Minutes API V1 端点枚举
425#[derive(Debug, Clone, PartialEq)]
426pub enum MinutesApiV1 {
427    /// 获取妙记信息
428    Get(String),
429    /// 下载妙记音视频文件
430    MediaGet(String),
431    /// 导出妙记文字记录
432    TranscriptGet(String),
433    /// 获取妙记统计数据
434    StatisticsGet(String),
435}
436
437impl MinutesApiV1 {
438    /// 生成对应的 URL
439    pub fn to_url(&self) -> String {
440        match self {
441            MinutesApiV1::Get(minute_token) => {
442                format!("/open-apis/minutes/v1/minutes/{}", minute_token)
443            }
444            MinutesApiV1::MediaGet(minute_token) => {
445                format!("/open-apis/minutes/v1/minutes/{}/media", minute_token)
446            }
447            MinutesApiV1::TranscriptGet(minute_token) => {
448                format!("/open-apis/minutes/v1/minutes/{}/transcript", minute_token)
449            }
450            MinutesApiV1::StatisticsGet(minute_token) => {
451                format!("/open-apis/minutes/v1/minutes/{}/statistics", minute_token)
452            }
453        }
454    }
455}
456
457/// Wiki API V1 端点枚举
458#[derive(Debug, Clone, PartialEq)]
459pub enum WikiApiV1 {
460    /// 搜索Wiki
461    NodeSearch,
462}
463
464impl WikiApiV1 {
465    /// 生成对应的 URL
466    pub fn to_url(&self) -> String {
467        match self {
468            WikiApiV1::NodeSearch => "/open-apis/wiki/v1/nodes/search".to_string(),
469        }
470    }
471}
472
473/// Docs API V1 端点枚举
474#[derive(Debug, Clone, PartialEq)]
475pub enum DocsApiV1 {
476    /// 获取云文档内容
477    ContentGet,
478}
479
480impl DocsApiV1 {
481    /// 生成对应的 URL
482    pub fn to_url(&self) -> String {
483        match self {
484            DocsApiV1::ContentGet => "/open-apis/docs/v1/content".to_string(),
485        }
486    }
487}
488
489/// Docx API V1 端点枚举
490#[derive(Debug, Clone, PartialEq)]
491pub enum DocxApiV1 {
492    // 群公告相关API (7个)
493    /// 获取群公告基本信息
494    ChatAnnouncementGet(String),
495    /// 获取群公告所有块
496    ChatAnnouncementBlockList(String),
497    /// 在群公告中创建块
498    ChatAnnouncementBlockChildrenCreate(String, String),
499    /// 批量更新群公告块的内容
500    ChatAnnouncementBlockBatchUpdate(String),
501    /// 获取群公告块的内容
502    ChatAnnouncementBlockGet(String, String),
503    /// 获取所有子块
504    ChatAnnouncementBlockChildrenGet(String, String),
505    /// 删除群公告中的块
506    ChatAnnouncementBlockChildrenBatchDelete(String, String),
507
508    // 文档相关API (12个)
509    /// 创建文档
510    DocumentCreate,
511    /// 获取文档基本信息
512    DocumentGet(String),
513    /// 获取文档纯文本内容
514    DocumentRawContent(String),
515    /// 获取文档所有块
516    DocumentBlockList(String),
517    /// 创建块
518    DocumentBlockChildrenCreate(String, String),
519    /// 创建嵌套块
520    DocumentBlockDescendantCreate(String, String),
521    /// 更新块的内容
522    DocumentBlockPatch(String, String),
523    /// 获取块的内容
524    DocumentBlockGet(String, String),
525    /// 批量更新块的内容
526    DocumentBlockBatchUpdate(String),
527    /// 获取所有子块
528    DocumentBlockChildrenGet(String, String),
529    /// 删除块
530    DocumentBlockChildrenBatchDelete(String, String),
531    /// Markdown/HTML 内容转换为文档块
532    DocumentConvert,
533}
534
535impl DocxApiV1 {
536    /// 生成对应的 URL
537    pub fn to_url(&self) -> String {
538        match self {
539            // 群公告相关API (7个)
540            DocxApiV1::ChatAnnouncementGet(chat_id) => {
541                format!("/open-apis/docx/v1/chats/{}/announcement", chat_id)
542            }
543            DocxApiV1::ChatAnnouncementBlockList(chat_id) => {
544                format!("/open-apis/docx/v1/chats/{}/announcement/blocks", chat_id)
545            }
546            DocxApiV1::ChatAnnouncementBlockChildrenCreate(chat_id, block_id) => {
547                format!(
548                    "/open-apis/docx/v1/chats/{}/announcement/blocks/{}/children",
549                    chat_id, block_id
550                )
551            }
552            DocxApiV1::ChatAnnouncementBlockBatchUpdate(chat_id) => {
553                format!(
554                    "/open-apis/docx/v1/chats/{}/announcement/blocks/batch_update",
555                    chat_id
556                )
557            }
558            DocxApiV1::ChatAnnouncementBlockGet(chat_id, block_id) => {
559                format!(
560                    "/open-apis/docx/v1/chats/{}/announcement/blocks/{}",
561                    chat_id, block_id
562                )
563            }
564            DocxApiV1::ChatAnnouncementBlockChildrenGet(chat_id, block_id) => {
565                format!(
566                    "/open-apis/docx/v1/chats/{}/announcement/blocks/{}/children",
567                    chat_id, block_id
568                )
569            }
570            DocxApiV1::ChatAnnouncementBlockChildrenBatchDelete(chat_id, block_id) => {
571                format!(
572                    "/open-apis/docx/v1/chats/{}/announcement/blocks/{}/children/batch_delete",
573                    chat_id, block_id
574                )
575            }
576
577            // 文档相关API (12个)
578            DocxApiV1::DocumentCreate => "/open-apis/docx/v1/documents".to_string(),
579            DocxApiV1::DocumentGet(document_id) => {
580                format!("/open-apis/docx/v1/documents/{}", document_id)
581            }
582            DocxApiV1::DocumentRawContent(document_id) => {
583                format!("/open-apis/docx/v1/documents/{}/raw_content", document_id)
584            }
585            DocxApiV1::DocumentBlockList(document_id) => {
586                format!("/open-apis/docx/v1/documents/{}/blocks", document_id)
587            }
588            DocxApiV1::DocumentBlockChildrenCreate(document_id, block_id) => {
589                format!(
590                    "/open-apis/docx/v1/documents/{}/blocks/{}/children",
591                    document_id, block_id
592                )
593            }
594            DocxApiV1::DocumentBlockDescendantCreate(document_id, block_id) => {
595                format!(
596                    "/open-apis/docx/v1/documents/{}/blocks/{}/descendant",
597                    document_id, block_id
598                )
599            }
600            DocxApiV1::DocumentBlockPatch(document_id, block_id) => {
601                format!(
602                    "/open-apis/docx/v1/documents/{}/blocks/{}",
603                    document_id, block_id
604                )
605            }
606            DocxApiV1::DocumentBlockGet(document_id, block_id) => {
607                format!(
608                    "/open-apis/docx/v1/documents/{}/blocks/{}",
609                    document_id, block_id
610                )
611            }
612            DocxApiV1::DocumentBlockBatchUpdate(document_id) => {
613                format!(
614                    "/open-apis/docx/v1/documents/{}/blocks/batch_update",
615                    document_id
616                )
617            }
618            DocxApiV1::DocumentBlockChildrenGet(document_id, block_id) => {
619                format!(
620                    "/open-apis/docx/v1/documents/{}/blocks/{}/children",
621                    document_id, block_id
622                )
623            }
624            DocxApiV1::DocumentBlockChildrenBatchDelete(document_id, block_id) => {
625                format!(
626                    "/open-apis/docx/v1/documents/{}/blocks/{}/children/batch_delete",
627                    document_id, block_id
628                )
629            }
630            // 注意:该接口虽然归类在 docx-v1 文档下,但实际 HTTP URL 不包含 /v1
631            DocxApiV1::DocumentConvert => "/open-apis/docx/documents/blocks/convert".to_string(),
632        }
633    }
634}
635
636/// Wiki API V2 端点枚举
637#[derive(Debug, Clone, PartialEq)]
638pub enum WikiApiV2 {
639    /// 获取知识空间列表
640    SpaceList,
641    /// 获取知识空间信息
642    SpaceGet(String),
643    /// 创建知识空间
644    SpaceCreate,
645    /// 更新知识空间设置
646    SpaceSettingUpdate(String),
647    /// 获取知识空间节点信息
648    SpaceGetNode,
649    /// 获取知识空间子节点列表
650    SpaceNodeList(String),
651    /// 创建知识空间节点
652    SpaceNodeCreate(String),
653    /// 获取知识空间成员列表
654    SpaceMemberList(String),
655    /// 添加知识空间成员
656    SpaceMemberCreate(String),
657    /// 删除知识空间成员
658    SpaceMemberDelete(String, String), // space_id, member_id
659    /// 移动知识空间节点
660    SpaceNodeMove(String, String),
661    /// 更新知识空间节点标题
662    SpaceNodeUpdateTitle(String, String),
663    /// 创建知识空间节点副本
664    SpaceNodeCopy(String, String),
665    /// 移动云空间文档至知识空间
666    SpaceNodeMoveDocsToWiki(String),
667    /// 获取任务结果
668    TaskGet(String),
669}
670
671impl WikiApiV2 {
672    /// 生成对应的 URL
673    pub fn to_url(&self) -> String {
674        match self {
675            WikiApiV2::SpaceList => "/open-apis/wiki/v2/spaces".to_string(),
676            WikiApiV2::SpaceGet(space_id) => {
677                format!("/open-apis/wiki/v2/spaces/{}", space_id)
678            }
679            WikiApiV2::SpaceCreate => "/open-apis/wiki/v2/spaces".to_string(),
680            WikiApiV2::SpaceSettingUpdate(space_id) => {
681                format!("/open-apis/wiki/v2/spaces/{}/setting", space_id)
682            }
683            WikiApiV2::SpaceGetNode => "/open-apis/wiki/v2/spaces/get_node".to_string(),
684            WikiApiV2::SpaceNodeList(space_id) => {
685                format!("/open-apis/wiki/v2/spaces/{}/nodes", space_id)
686            }
687            WikiApiV2::SpaceNodeCreate(space_id) => {
688                format!("/open-apis/wiki/v2/spaces/{}/nodes", space_id)
689            }
690            WikiApiV2::SpaceMemberList(space_id) => {
691                format!("/open-apis/wiki/v2/spaces/{}/members", space_id)
692            }
693            WikiApiV2::SpaceMemberCreate(space_id) => {
694                format!("/open-apis/wiki/v2/spaces/{}/members", space_id)
695            }
696            WikiApiV2::SpaceMemberDelete(space_id, member_id) => {
697                format!(
698                    "/open-apis/wiki/v2/spaces/{}/members/{}",
699                    space_id, member_id
700                )
701            }
702            WikiApiV2::SpaceNodeMove(space_id, node_token) => {
703                format!(
704                    "/open-apis/wiki/v2/spaces/{}/nodes/{}/move",
705                    space_id, node_token
706                )
707            }
708            WikiApiV2::SpaceNodeUpdateTitle(space_id, node_token) => {
709                format!(
710                    "/open-apis/wiki/v2/spaces/{}/nodes/{}/update_title",
711                    space_id, node_token
712                )
713            }
714            WikiApiV2::SpaceNodeCopy(space_id, node_token) => {
715                format!(
716                    "/open-apis/wiki/v2/spaces/{}/nodes/{}/copy",
717                    space_id, node_token
718                )
719            }
720            WikiApiV2::SpaceNodeMoveDocsToWiki(space_id) => {
721                format!(
722                    "/open-apis/wiki/v2/spaces/{}/nodes/move_docs_to_wiki",
723                    space_id
724                )
725            }
726            WikiApiV2::TaskGet(task_id) => {
727                format!("/open-apis/wiki/v2/tasks/{}", task_id)
728            }
729        }
730    }
731}
732
733/// CCM Doc API Old V1 端点枚举
734/// 对应 meta.project = ccm_doc, meta.version = old
735#[derive(Debug, Clone, PartialEq)]
736pub enum CcmDocApiOld {
737    /// 创建旧版文档
738    Create,
739    /// 获取旧版文档元信息
740    Meta(String), // doc_token
741    /// 获取旧版文档中的电子表格元数据
742    SheetMeta(String), // doc_token
743    /// 获取旧版文档纯文本内容
744    RawContent(String), // doc_token
745    /// 获取旧版文档富文本内容
746    Content(String), // doc_token
747    /// 编辑旧版文档内容
748    BatchUpdate(String), // doc_token
749}
750
751impl CcmDocApiOld {
752    /// 生成对应的 URL
753    pub fn to_url(&self) -> String {
754        match self {
755            CcmDocApiOld::Create => "/open-apis/doc/v2/create".to_string(),
756            CcmDocApiOld::Meta(doc_token) => {
757                format!("/open-apis/doc/v2/meta/{}", doc_token)
758            }
759            CcmDocApiOld::SheetMeta(doc_token) => {
760                format!("/open-apis/doc/v2/{}/sheet_meta", doc_token)
761            }
762            CcmDocApiOld::RawContent(doc_token) => {
763                format!("/open-apis/doc/v2/{}/raw_content", doc_token)
764            }
765            CcmDocApiOld::Content(doc_token) => {
766                format!("/open-apis/doc/v2/{}/content", doc_token)
767            }
768            CcmDocApiOld::BatchUpdate(doc_token) => {
769                format!("/open-apis/doc/v2/{}/batch_update", doc_token)
770            }
771        }
772    }
773}
774
775/// CCM Docs API Old V1 端点枚举
776/// 对应 meta.project = ccm_docs, meta.version = old
777#[derive(Debug, Clone, PartialEq)]
778pub enum CcmDocsApiOld {
779    /// 搜索云文档
780    SearchObject,
781    /// 获取元数据
782    Meta,
783}
784
785impl CcmDocsApiOld {
786    /// 生成对应的 URL
787    pub fn to_url(&self) -> String {
788        match self {
789            CcmDocsApiOld::SearchObject => "/open-apis/suite/docs-api/search/object".to_string(),
790            CcmDocsApiOld::Meta => "/open-apis/suite/docs-api/meta".to_string(),
791        }
792    }
793}
794
795/// CCM Drive Explorer API Old V2 端点枚举
796/// 对应 meta.project = ccm_drive_explorer, meta.version = old
797#[derive(Debug, Clone, PartialEq)]
798pub enum CcmDriveExplorerApiOld {
799    /// 获取我的空间(根文件夹)元数据
800    RootFolderMeta,
801    /// 获取文件夹元数据
802    FolderMeta(String), // folder_token
803    /// 新建文件
804    File(String), // folder_token
805    /// 删除Sheet
806    FileSpreadsheets(String), // spreadsheet_token
807    /// 复制文档
808    FileCopy(String), // file_token
809    /// 删除Doc
810    FileDocs(String), // doc_token
811    /// 获取文件夹下的文档清单
812    FolderChildren(String), // folder_token
813    /// 新建文件夹
814    Folder(String), // folder_token
815}
816
817impl CcmDriveExplorerApiOld {
818    /// 生成对应的 URL
819    pub fn to_url(&self) -> String {
820        match self {
821            CcmDriveExplorerApiOld::RootFolderMeta => {
822                "/open-apis/drive/explorer/v2/root_folder/meta".to_string()
823            }
824            CcmDriveExplorerApiOld::FolderMeta(folder_token) => {
825                format!("/open-apis/drive/explorer/v2/folder/{}/meta", folder_token)
826            }
827            CcmDriveExplorerApiOld::File(folder_token) => {
828                format!("/open-apis/drive/explorer/v2/file/{}", folder_token)
829            }
830            CcmDriveExplorerApiOld::FileSpreadsheets(spreadsheet_token) => {
831                format!(
832                    "/open-apis/drive/explorer/v2/file/spreadsheets/{}",
833                    spreadsheet_token
834                )
835            }
836            CcmDriveExplorerApiOld::FileCopy(file_token) => {
837                format!(
838                    "/open-apis/drive/explorer/v2/file/copy/files/{}",
839                    file_token
840                )
841            }
842            CcmDriveExplorerApiOld::FileDocs(doc_token) => {
843                format!("/open-apis/drive/explorer/v2/file/docs/{}", doc_token)
844            }
845            CcmDriveExplorerApiOld::FolderChildren(folder_token) => {
846                format!(
847                    "/open-apis/drive/explorer/v2/folder/{}/children",
848                    folder_token
849                )
850            }
851            CcmDriveExplorerApiOld::Folder(folder_token) => {
852                format!("/open-apis/drive/explorer/v2/folder/{}", folder_token)
853            }
854        }
855    }
856}
857
858/// CCM Drive Explorer API V1 端点枚举
859/// 对应 meta.project = ccm_drive_explorer, meta.version = v1
860#[derive(Debug, Clone, PartialEq)]
861pub enum CcmDriveExplorerApi {
862    /// 获取根目录元数据
863    RootFolderMeta,
864    /// 获取文件夹元数据
865    FolderMeta(String), // folder_token
866    /// 获取文件元数据
867    File(String), // file_token
868    /// 复制文件
869    FileCopy(String), // file_token
870    /// 获取文档文件信息
871    FileDocs(String), // file_token
872    /// 获取表格文件信息
873    FileSpreadsheets(String), // file_token
874    /// 获取文件夹子内容
875    FolderChildren(String), // folder_token
876    /// 创建文件夹
877    Folder,
878}
879
880impl CcmDriveExplorerApi {
881    /// 生成对应的 URL
882    pub fn to_url(&self) -> String {
883        match self {
884            CcmDriveExplorerApi::RootFolderMeta => {
885                "/open-apis/drive/v1/explorer/root_folder/meta".to_string()
886            }
887            CcmDriveExplorerApi::FolderMeta(folder_token) => {
888                format!("/open-apis/drive/v1/explorer/folder/{}/meta", folder_token)
889            }
890            CcmDriveExplorerApi::File(file_token) => {
891                format!("/open-apis/drive/v1/explorer/file/{}", file_token)
892            }
893            CcmDriveExplorerApi::FileCopy(file_token) => {
894                format!(
895                    "/open-apis/drive/v1/explorer/file/copy/files/{}",
896                    file_token
897                )
898            }
899            CcmDriveExplorerApi::FileDocs(file_token) => {
900                format!("/open-apis/drive/v1/explorer/file/docs/{}", file_token)
901            }
902            CcmDriveExplorerApi::FileSpreadsheets(file_token) => {
903                format!(
904                    "/open-apis/drive/v1/explorer/file/spreadsheets/{}",
905                    file_token
906                )
907            }
908            CcmDriveExplorerApi::FolderChildren(folder_token) => {
909                format!(
910                    "/open-apis/drive/v1/explorer/folder/{}/children",
911                    folder_token
912                )
913            }
914            CcmDriveExplorerApi::Folder => "/open-apis/drive/v1/explorer/folder".to_string(),
915        }
916    }
917
918    /// 生成带参数的 URL
919    pub fn to_url_with_params(&self, params: &[(&str, String)]) -> String {
920        let base_url = self.to_url();
921        if params.is_empty() {
922            return base_url;
923        }
924
925        let query_string = params
926            .iter()
927            .map(|(key, value)| format!("{}={}", key, simple_url_encode(value)))
928            .collect::<Vec<_>>()
929            .join("&");
930
931        format!("{}?{}", base_url, query_string)
932    }
933}
934
935/// 简单的URL编码函数,用于查询参数编码
936fn simple_url_encode(input: &str) -> String {
937    input
938        .chars()
939        .map(|c| match c {
940            'A'..='Z' | 'a'..='z' | '0'..='9' | '-' | '_' | '.' | '~' => c.to_string(),
941            _ => format!("%{:02X}", c as u8),
942        })
943        .collect()
944}
945
946/// CCM Drive Permission API V1 端点枚举
947/// 对应 meta.project = permission, meta.version = v1
948#[derive(Debug, Clone, PartialEq)]
949pub enum PermissionApi {
950    /// 判断协作者是否有某权限
951    MemberPermitted,
952    /// 转移拥有者
953    MemberTransfer,
954    /// 获取云文档权限设置V2
955    Public,
956}
957
958impl PermissionApi {
959    /// 生成对应的 URL
960    pub fn to_url(&self) -> String {
961        match self {
962            PermissionApi::MemberPermitted => {
963                "/open-apis/drive/v1/permission/member/permitted".to_string()
964            }
965            PermissionApi::MemberTransfer => {
966                "/open-apis/drive/v1/permission/member/transfer".to_string()
967            }
968            PermissionApi::Public => "/open-apis/drive/v1/permission/v2/public/".to_string(),
969        }
970    }
971}
972
973/// CCM Drive Permission API Old V2 端点枚举
974/// 对应 meta.project = permission, meta.version = old
975#[derive(Debug, Clone, PartialEq)]
976pub enum PermissionApiOld {
977    /// 判断协作者是否有某权限
978    MemberPermitted,
979    /// 转移拥有者
980    MemberTransfer,
981    /// 获取云文档权限设置V2
982    Public,
983}
984
985impl PermissionApiOld {
986    /// 生成对应的 URL
987    pub fn to_url(&self) -> String {
988        match self {
989            PermissionApiOld::MemberPermitted => {
990                "/open-apis/drive/v1/permission/member/permitted".to_string()
991            }
992            PermissionApiOld::MemberTransfer => {
993                "/open-apis/drive/v1/permission/member/transfer".to_string()
994            }
995            PermissionApiOld::Public => "/open-apis/drive/v1/permission/v2/public/".to_string(),
996        }
997    }
998}
999
1000/// CCM Sheet API Old V2 端点枚举
1001/// 对应 meta.project = ccm_sheet, meta.version = old
1002#[derive(Debug, Clone, PartialEq)]
1003pub enum CcmSheetApiOld {
1004    /// 操作工作表 (第一个)
1005    OperateSheets(String), // spreadsheet_token
1006    /// 更新工作表属性 (第二个)
1007    UpdateSheetProperties(String), // spreadsheet_token
1008    /// 增加行列
1009    DimensionRange(String), // spreadsheet_token
1010    /// 插入行列
1011    InsertDimensionRange(String), // spreadsheet_token
1012    /// 更新行列
1013    DimensionRangeUpdate(String), // spreadsheet_token
1014    /// 删除行列
1015    DimensionRangeDelete(String), // spreadsheet_token
1016    /// 合并单元格
1017    MergeCells(String), // spreadsheet_token
1018    /// 拆分单元格
1019    UnmergeCells(String), // spreadsheet_token
1020    /// 设置单元格样式
1021    Style(String), // spreadsheet_token
1022    /// 批量设置单元格样式
1023    StylesBatchUpdate(String), // spreadsheet_token
1024    /// 插入数据
1025    ValuesPrepend(String), // spreadsheet_token
1026    /// 追加数据
1027    ValuesAppend(String), // spreadsheet_token
1028    /// 写入图片
1029    ValuesImage(String), // spreadsheet_token
1030    /// 读取单个范围
1031    ValuesRange(String, String), // spreadsheet_token, range
1032    /// 读取多个范围
1033    ValuesBatchGet(String), // spreadsheet_token
1034    /// 向单个范围写入数据
1035    Values(String), // spreadsheet_token
1036    /// 向多个范围写入数据
1037    ValuesBatchUpdate(String), // spreadsheet_token
1038    /// 增加保护范围
1039    ProtectedDimension(String), // spreadsheet_token
1040    /// 修改保护范围
1041    ProtectedRangeBatchUpdate(String), // spreadsheet_token
1042    /// 获取保护范围
1043    ProtectedRangeBatchGet(String), // spreadsheet_token
1044    /// 删除保护范围
1045    ProtectedRangeBatchDel(String), // spreadsheet_token
1046    /// 获取表格元数据
1047    Metainfo(String), // spreadsheet_token
1048    /// 更新表格属性
1049    Properties(String), // spreadsheet_token
1050    /// 导入表格
1051    Import,
1052    /// 查询导入结果
1053    ImportResult,
1054    /// 获取条件格式
1055    ConditionFormats(String), // spreadsheet_token
1056    /// 批量创建条件格式
1057    ConditionFormatsBatchCreate(String), // spreadsheet_token
1058    /// 批量删除条件格式
1059    ConditionFormatsBatchDelete(String), // spreadsheet_token
1060    /// 批量更新条件格式
1061    ConditionFormatsBatchUpdate(String), // spreadsheet_token
1062    /// 获取数据验证规则
1063    DataValidation(String), // spreadsheet_token
1064    /// 创建数据验证规则
1065    DataValidationCreate(String), // spreadsheet_token
1066    /// 更新下拉列表设置(PUT)
1067    DataValidationUpdate(String, String), // spreadsheet_token, sheet_id
1068    /// 删除下拉列表设置(DELETE,按 range 删除)
1069    DataValidationDelete(String), // spreadsheet_token
1070    /// 读取单个范围
1071    ReadSingleRange(String, String), // spreadsheet_token, range
1072    /// 读取多个范围
1073    ReadMultipleRanges(String), // spreadsheet_token
1074    /// 写入单个范围
1075    WriteSingleRange(String), // spreadsheet_token
1076    /// 批量写入范围
1077    BatchWriteRanges(String), // spreadsheet_token
1078    /// 追加数据
1079    AppendValues(String), // spreadsheet_token
1080    /// 插入数据
1081    InsertValues(String), // spreadsheet_token
1082    /// 获取电子表格信息
1083    GetSpreadsheet(String), // spreadsheet_token
1084    /// 创建电子表格
1085    CreateSpreadsheet,
1086    /// 修改电子表格属性
1087    UpdateSpreadsheet(String), // spreadsheet_token
1088    /// 操作工作表
1089    AddSheet(String), // spreadsheet_token
1090    /// 查询工作表
1091    GetSheet(String, String), // spreadsheet_token, sheet_id
1092    /// 更新工作表
1093    UpdateSheet(String), // spreadsheet_token
1094    /// 删除工作表
1095    DeleteSheet(String), // spreadsheet_token
1096    /// 创建筛选 (V3)
1097    CreateFilter(String), // spreadsheet_token
1098    /// 获取筛选 (V3)
1099    GetFilter(String), // spreadsheet_token
1100    /// 更新筛选 (V3)
1101    UpdateFilter(String), // spreadsheet_token
1102    /// 删除筛选 (V3)
1103    DeleteFilter(String), // spreadsheet_token
1104    /// 创建筛选视图 (V3)
1105    CreateFilterView(String, String), // spreadsheet_token, sheet_id
1106    /// 更新筛选视图 (V3)
1107    UpdateFilterView(String, String, String), // spreadsheet_token, sheet_id, filter_view_id
1108    /// 查询筛选视图 (V3)
1109    QueryFilterViews(String, String), // spreadsheet_token, sheet_id
1110    /// 获取筛选视图 (V3)
1111    GetFilterView(String, String, String), // spreadsheet_token, sheet_id, filter_view_id
1112    /// 删除筛选视图 (V3)
1113    DeleteFilterView(String, String, String), // spreadsheet_token, sheet_id, filter_view_id
1114    /// 创建筛选条件 (V3)
1115    CreateFilterCondition(String, String, String), // spreadsheet_token, sheet_id, filter_view_id
1116    /// 更新筛选条件 (V3)
1117    UpdateFilterCondition(String, String, String, String), // spreadsheet_token, sheet_id, filter_view_id, condition_id
1118    /// 查询筛选条件 (V3)
1119    QueryFilterConditions(String, String, String), // spreadsheet_token, sheet_id, filter_view_id
1120    /// 获取筛选条件 (V3)
1121    GetFilterCondition(String, String, String, String), // spreadsheet_token, sheet_id, filter_view_id, condition_id
1122    /// 删除筛选条件 (V3)
1123    DeleteFilterCondition(String, String, String, String), // spreadsheet_token, sheet_id, filter_view_id, condition_id
1124    /// 创建浮动图片 (V3)
1125    CreateFloatImage(String, String), // spreadsheet_token, sheet_id
1126    /// 更新浮动图片 (V3)
1127    UpdateFloatImage(String, String, String), // spreadsheet_token, sheet_id, float_image_id
1128    /// 获取浮动图片 (V3)
1129    GetFloatImage(String, String, String), // spreadsheet_token, sheet_id, float_image_id
1130    /// 查询浮动图片 (V3)
1131    QueryFloatImages(String, String), // spreadsheet_token, sheet_id
1132    /// 删除浮动图片 (V3)
1133    DeleteFloatImage(String, String, String), // spreadsheet_token, sheet_id, float_image_id
1134    /// 删除范围 (V3)
1135    DeleteRange(String), // spreadsheet_token
1136    /// 插入维度 (V3)
1137    InsertDimension(String), // spreadsheet_token
1138    /// 移动维度 (V3)
1139    MoveDimension(String), // spreadsheet_token
1140    /// 替换范围 (V3)
1141    ReplaceRange(String), // spreadsheet_token
1142    /// 查找替换 (V3)
1143    FindReplace(String), // spreadsheet_token
1144}
1145
1146impl CcmSheetApiOld {
1147    /// 生成对应的 URL
1148    pub fn to_url(&self) -> String {
1149        match self {
1150            CcmSheetApiOld::OperateSheets(spreadsheet_token) => {
1151                format!(
1152                    "/open-apis/sheets/v2/spreadsheets/{}/sheets_batch_update",
1153                    spreadsheet_token
1154                )
1155            }
1156            CcmSheetApiOld::UpdateSheetProperties(spreadsheet_token) => {
1157                format!(
1158                    "/open-apis/sheets/v2/spreadsheets/{}/sheets_batch_update",
1159                    spreadsheet_token
1160                )
1161            }
1162            CcmSheetApiOld::Style(spreadsheet_token) => {
1163                format!(
1164                    "/open-apis/sheets/v2/spreadsheets/{}/style",
1165                    spreadsheet_token
1166                )
1167            }
1168            CcmSheetApiOld::StylesBatchUpdate(spreadsheet_token) => {
1169                format!(
1170                    "/open-apis/sheets/v2/spreadsheets/{}/styles_batch_update",
1171                    spreadsheet_token
1172                )
1173            }
1174            CcmSheetApiOld::ValuesPrepend(spreadsheet_token) => {
1175                format!(
1176                    "/open-apis/sheets/v2/spreadsheets/{}/values_prepend",
1177                    spreadsheet_token
1178                )
1179            }
1180            CcmSheetApiOld::ValuesAppend(spreadsheet_token) => {
1181                format!(
1182                    "/open-apis/sheets/v2/spreadsheets/{}/values_append",
1183                    spreadsheet_token
1184                )
1185            }
1186            CcmSheetApiOld::ValuesImage(spreadsheet_token) => {
1187                format!(
1188                    "/open-apis/sheets/v2/spreadsheets/{}/values_image",
1189                    spreadsheet_token
1190                )
1191            }
1192            CcmSheetApiOld::ValuesRange(spreadsheet_token, range) => {
1193                format!(
1194                    "/open-apis/sheets/v2/spreadsheets/{}/values/{}",
1195                    spreadsheet_token, range
1196                )
1197            }
1198            CcmSheetApiOld::ValuesBatchGet(spreadsheet_token) => {
1199                format!(
1200                    "/open-apis/sheets/v2/spreadsheets/{}/values_batch_get",
1201                    spreadsheet_token
1202                )
1203            }
1204            CcmSheetApiOld::Values(spreadsheet_token) => {
1205                format!(
1206                    "/open-apis/sheets/v2/spreadsheets/{}/values",
1207                    spreadsheet_token
1208                )
1209            }
1210            CcmSheetApiOld::ValuesBatchUpdate(spreadsheet_token) => {
1211                format!(
1212                    "/open-apis/sheets/v2/spreadsheets/{}/values_batch_update",
1213                    spreadsheet_token
1214                )
1215            }
1216            CcmSheetApiOld::DimensionRange(spreadsheet_token) => {
1217                format!(
1218                    "/open-apis/sheets/v2/spreadsheets/{}/dimension_range",
1219                    spreadsheet_token
1220                )
1221            }
1222            CcmSheetApiOld::InsertDimensionRange(spreadsheet_token) => {
1223                format!(
1224                    "/open-apis/sheets/v2/spreadsheets/{}/insert_dimension_range",
1225                    spreadsheet_token
1226                )
1227            }
1228            CcmSheetApiOld::DimensionRangeUpdate(spreadsheet_token) => {
1229                format!(
1230                    "/open-apis/sheets/v2/spreadsheets/{}/dimension_range",
1231                    spreadsheet_token
1232                )
1233            }
1234            CcmSheetApiOld::DimensionRangeDelete(spreadsheet_token) => {
1235                format!(
1236                    "/open-apis/sheets/v2/spreadsheets/{}/dimension_range",
1237                    spreadsheet_token
1238                )
1239            }
1240            CcmSheetApiOld::MergeCells(spreadsheet_token) => {
1241                format!(
1242                    "/open-apis/sheets/v2/spreadsheets/{}/merge_cells",
1243                    spreadsheet_token
1244                )
1245            }
1246            CcmSheetApiOld::UnmergeCells(spreadsheet_token) => {
1247                format!(
1248                    "/open-apis/sheets/v2/spreadsheets/{}/unmerge_cells",
1249                    spreadsheet_token
1250                )
1251            }
1252            CcmSheetApiOld::ProtectedDimension(spreadsheet_token) => {
1253                format!(
1254                    "/open-apis/sheets/v2/spreadsheets/{}/protected_dimension",
1255                    spreadsheet_token
1256                )
1257            }
1258            CcmSheetApiOld::ProtectedRangeBatchUpdate(spreadsheet_token) => {
1259                format!(
1260                    "/open-apis/sheets/v2/spreadsheets/{}/protected_range_batch_update",
1261                    spreadsheet_token
1262                )
1263            }
1264            CcmSheetApiOld::ProtectedRangeBatchGet(spreadsheet_token) => {
1265                format!(
1266                    "/open-apis/sheets/v2/spreadsheets/{}/protected_range_batch_get",
1267                    spreadsheet_token
1268                )
1269            }
1270            CcmSheetApiOld::ProtectedRangeBatchDel(spreadsheet_token) => {
1271                format!(
1272                    "/open-apis/sheets/v2/spreadsheets/{}/protected_range_batch_del",
1273                    spreadsheet_token
1274                )
1275            }
1276            CcmSheetApiOld::Metainfo(spreadsheet_token) => {
1277                format!(
1278                    "/open-apis/sheets/v2/spreadsheets/{}/metainfo",
1279                    spreadsheet_token
1280                )
1281            }
1282            CcmSheetApiOld::Properties(spreadsheet_token) => {
1283                format!(
1284                    "/open-apis/sheets/v2/spreadsheets/{}/properties",
1285                    spreadsheet_token
1286                )
1287            }
1288            CcmSheetApiOld::Import => "/open-apis/sheets/v2/import".to_string(),
1289            CcmSheetApiOld::ImportResult => "/open-apis/sheets/v2/import/result".to_string(),
1290            CcmSheetApiOld::ConditionFormats(spreadsheet_token) => {
1291                format!(
1292                    "/open-apis/sheets/v2/spreadsheets/{}/condition_formats",
1293                    spreadsheet_token
1294                )
1295            }
1296            CcmSheetApiOld::ConditionFormatsBatchCreate(spreadsheet_token) => {
1297                format!(
1298                    "/open-apis/sheets/v2/spreadsheets/{}/condition_formats/batch_create",
1299                    spreadsheet_token
1300                )
1301            }
1302            CcmSheetApiOld::ConditionFormatsBatchDelete(spreadsheet_token) => {
1303                format!(
1304                    "/open-apis/sheets/v2/spreadsheets/{}/condition_formats/batch_delete",
1305                    spreadsheet_token
1306                )
1307            }
1308            CcmSheetApiOld::ConditionFormatsBatchUpdate(spreadsheet_token) => {
1309                format!(
1310                    "/open-apis/sheets/v2/spreadsheets/{}/condition_formats/batch_update",
1311                    spreadsheet_token
1312                )
1313            }
1314            CcmSheetApiOld::DataValidation(spreadsheet_token) => {
1315                format!(
1316                    "/open-apis/sheets/v2/spreadsheets/{}/dataValidation",
1317                    spreadsheet_token
1318                )
1319            }
1320            CcmSheetApiOld::DataValidationCreate(spreadsheet_token) => {
1321                format!(
1322                    "/open-apis/sheets/v2/spreadsheets/{}/dataValidation",
1323                    spreadsheet_token
1324                )
1325            }
1326            CcmSheetApiOld::DataValidationUpdate(spreadsheet_token, sheet_id) => {
1327                format!(
1328                    "/open-apis/sheets/v2/spreadsheets/{}/dataValidation/{}",
1329                    spreadsheet_token, sheet_id
1330                )
1331            }
1332            CcmSheetApiOld::DataValidationDelete(spreadsheet_token) => {
1333                format!(
1334                    "/open-apis/sheets/v2/spreadsheets/{}/dataValidation",
1335                    spreadsheet_token
1336                )
1337            }
1338            CcmSheetApiOld::ReadSingleRange(spreadsheet_token, range) => {
1339                format!(
1340                    "/open-apis/sheets/v2/spreadsheets/{}/values/{}",
1341                    spreadsheet_token, range
1342                )
1343            }
1344            CcmSheetApiOld::ReadMultipleRanges(spreadsheet_token) => {
1345                format!(
1346                    "/open-apis/sheets/v2/spreadsheets/{}/values_batch_get",
1347                    spreadsheet_token
1348                )
1349            }
1350            CcmSheetApiOld::WriteSingleRange(spreadsheet_token) => {
1351                format!(
1352                    "/open-apis/sheets/v2/spreadsheets/{}/values",
1353                    spreadsheet_token
1354                )
1355            }
1356            CcmSheetApiOld::BatchWriteRanges(spreadsheet_token) => {
1357                format!(
1358                    "/open-apis/sheets/v2/spreadsheets/{}/values_batch_update",
1359                    spreadsheet_token
1360                )
1361            }
1362            CcmSheetApiOld::AppendValues(spreadsheet_token) => {
1363                format!(
1364                    "/open-apis/sheets/v2/spreadsheets/{}/values_append",
1365                    spreadsheet_token
1366                )
1367            }
1368            CcmSheetApiOld::InsertValues(spreadsheet_token) => {
1369                format!(
1370                    "/open-apis/sheets/v2/spreadsheets/{}/values_prepend",
1371                    spreadsheet_token
1372                )
1373            }
1374            CcmSheetApiOld::GetSpreadsheet(spreadsheet_token) => {
1375                format!("/open-apis/sheets/v3/spreadsheets/{}", spreadsheet_token)
1376            }
1377            CcmSheetApiOld::CreateSpreadsheet => "/open-apis/sheets/v3/spreadsheets".to_string(),
1378            CcmSheetApiOld::UpdateSpreadsheet(spreadsheet_token) => {
1379                format!("/open-apis/sheets/v3/spreadsheets/{}", spreadsheet_token)
1380            }
1381            CcmSheetApiOld::AddSheet(spreadsheet_token) => {
1382                format!(
1383                    "/open-apis/sheets/v2/spreadsheets/{}/sheets_batch_update",
1384                    spreadsheet_token
1385                )
1386            }
1387            CcmSheetApiOld::GetSheet(spreadsheet_token, sheet_id) => {
1388                format!(
1389                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}",
1390                    spreadsheet_token, sheet_id
1391                )
1392            }
1393            CcmSheetApiOld::UpdateSheet(spreadsheet_token) => {
1394                format!(
1395                    "/open-apis/sheets/v2/spreadsheets/{}/sheets_batch_update",
1396                    spreadsheet_token
1397                )
1398            }
1399            CcmSheetApiOld::DeleteSheet(spreadsheet_token) => {
1400                format!(
1401                    "/open-apis/sheets/v2/spreadsheets/{}/sheets_batch_update",
1402                    spreadsheet_token
1403                )
1404            }
1405            CcmSheetApiOld::CreateFilter(spreadsheet_token) => {
1406                format!(
1407                    "/open-apis/sheets/v3/spreadsheets/{}/filterViews",
1408                    spreadsheet_token
1409                )
1410            }
1411            CcmSheetApiOld::GetFilter(spreadsheet_token) => {
1412                format!(
1413                    "/open-apis/sheets/v3/spreadsheets/{}/filterViews/query",
1414                    spreadsheet_token
1415                )
1416            }
1417            CcmSheetApiOld::UpdateFilter(spreadsheet_token) => {
1418                format!(
1419                    "/open-apis/sheets/v3/spreadsheets/{}/filterViews",
1420                    spreadsheet_token
1421                )
1422            }
1423            CcmSheetApiOld::DeleteFilter(spreadsheet_token) => {
1424                format!(
1425                    "/open-apis/sheets/v3/spreadsheets/{}/filterViews",
1426                    spreadsheet_token
1427                )
1428            }
1429            CcmSheetApiOld::CreateFilterView(spreadsheet_token, sheet_id) => {
1430                format!(
1431                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views",
1432                    spreadsheet_token, sheet_id
1433                )
1434            }
1435            CcmSheetApiOld::UpdateFilterView(spreadsheet_token, sheet_id, filter_view_id) => {
1436                format!(
1437                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/{}",
1438                    spreadsheet_token, sheet_id, filter_view_id
1439                )
1440            }
1441            CcmSheetApiOld::QueryFilterViews(spreadsheet_token, sheet_id) => {
1442                format!(
1443                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/query",
1444                    spreadsheet_token, sheet_id
1445                )
1446            }
1447            CcmSheetApiOld::GetFilterView(spreadsheet_token, sheet_id, filter_view_id) => {
1448                format!(
1449                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/{}",
1450                    spreadsheet_token, sheet_id, filter_view_id
1451                )
1452            }
1453            CcmSheetApiOld::DeleteFilterView(spreadsheet_token, sheet_id, filter_view_id) => {
1454                format!(
1455                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/{}",
1456                    spreadsheet_token, sheet_id, filter_view_id
1457                )
1458            }
1459            CcmSheetApiOld::CreateFilterCondition(spreadsheet_token, sheet_id, filter_view_id) => {
1460                format!(
1461                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/{}/conditions",
1462                    spreadsheet_token, sheet_id, filter_view_id
1463                )
1464            }
1465            CcmSheetApiOld::UpdateFilterCondition(
1466                spreadsheet_token,
1467                sheet_id,
1468                filter_view_id,
1469                condition_id,
1470            ) => {
1471                format!(
1472                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/{}/conditions/{}",
1473                    spreadsheet_token, sheet_id, filter_view_id, condition_id
1474                )
1475            }
1476            CcmSheetApiOld::QueryFilterConditions(spreadsheet_token, sheet_id, filter_view_id) => {
1477                format!("/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/{}/conditions/query", spreadsheet_token, sheet_id, filter_view_id)
1478            }
1479            CcmSheetApiOld::GetFilterCondition(
1480                spreadsheet_token,
1481                sheet_id,
1482                filter_view_id,
1483                condition_id,
1484            ) => {
1485                format!(
1486                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/{}/conditions/{}",
1487                    spreadsheet_token, sheet_id, filter_view_id, condition_id
1488                )
1489            }
1490            CcmSheetApiOld::DeleteFilterCondition(
1491                spreadsheet_token,
1492                sheet_id,
1493                filter_view_id,
1494                condition_id,
1495            ) => {
1496                format!(
1497                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/{}/conditions/{}",
1498                    spreadsheet_token, sheet_id, filter_view_id, condition_id
1499                )
1500            }
1501            CcmSheetApiOld::CreateFloatImage(spreadsheet_token, sheet_id) => {
1502                format!(
1503                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/float_images",
1504                    spreadsheet_token, sheet_id
1505                )
1506            }
1507            CcmSheetApiOld::UpdateFloatImage(spreadsheet_token, sheet_id, float_image_id) => {
1508                format!(
1509                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/float_images/{}",
1510                    spreadsheet_token, sheet_id, float_image_id
1511                )
1512            }
1513            CcmSheetApiOld::GetFloatImage(spreadsheet_token, sheet_id, float_image_id) => {
1514                format!(
1515                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/float_images/{}",
1516                    spreadsheet_token, sheet_id, float_image_id
1517                )
1518            }
1519            CcmSheetApiOld::QueryFloatImages(spreadsheet_token, sheet_id) => {
1520                format!(
1521                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/float_images/query",
1522                    spreadsheet_token, sheet_id
1523                )
1524            }
1525            CcmSheetApiOld::DeleteFloatImage(spreadsheet_token, sheet_id, float_image_id) => {
1526                format!(
1527                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/float_images/{}",
1528                    spreadsheet_token, sheet_id, float_image_id
1529                )
1530            }
1531            CcmSheetApiOld::DeleteRange(spreadsheet_token) => {
1532                format!(
1533                    "/open-apis/sheets/v3/spreadsheets/{}/dimensionRange/delete",
1534                    spreadsheet_token
1535                )
1536            }
1537            CcmSheetApiOld::InsertDimension(spreadsheet_token) => {
1538                format!(
1539                    "/open-apis/sheets/v3/spreadsheets/{}/dimensionRange/insert",
1540                    spreadsheet_token
1541                )
1542            }
1543            CcmSheetApiOld::MoveDimension(spreadsheet_token) => {
1544                format!(
1545                    "/open-apis/sheets/v3/spreadsheets/{}/dimensionRange/move",
1546                    spreadsheet_token
1547                )
1548            }
1549            CcmSheetApiOld::ReplaceRange(spreadsheet_token) => {
1550                format!(
1551                    "/open-apis/sheets/v3/spreadsheets/{}/values/batchReplace",
1552                    spreadsheet_token
1553                )
1554            }
1555            CcmSheetApiOld::FindReplace(spreadsheet_token) => {
1556                format!(
1557                    "/open-apis/sheets/v3/spreadsheets/{}/values/batchFindReplace",
1558                    spreadsheet_token
1559                )
1560            }
1561        }
1562    }
1563}
1564
1565/// Drive API 端点枚举
1566#[derive(Debug, Clone, PartialEq)]
1567pub enum DriveApi {
1568    // V1 APIs - 文件操作
1569    /// 获取文件夹中的文件清单
1570    ListFiles,
1571    /// 新建文件夹
1572    CreateFolder,
1573    /// 查询异步任务状态
1574    TaskCheck,
1575    /// 获取文件元数据(批量查询)
1576    BatchQueryMetas,
1577    /// 获取文件统计信息
1578    GetFileStatistics(String), // file_token
1579    /// 获取文件访问记录
1580    ListFileViewRecords(String), // file_token
1581    /// 复制文件
1582    CopyFile(String), // file_token
1583    /// 移动文件或文件夹
1584    MoveFile(String), // file_token
1585    /// 删除文件或文件夹
1586    DeleteFile(String), // file_token
1587    /// 创建文件快捷方式
1588    CreateShortcut,
1589    /// 上传文件
1590    UploadFile,
1591    /// 分片上传文件-预上传
1592    UploadPrepare,
1593    /// 分片上传文件-上传分片
1594    UploadPart,
1595    /// 分片上传文件-完成上传
1596    UploadFinish,
1597    /// 下载文件
1598    DownloadFile(String), // file_token
1599    /// 创建导入任务
1600    CreateImportTask,
1601    /// 查询导入任务结果
1602    GetImportTask(String), // ticket
1603    /// 创建导出任务
1604    CreateExportTask,
1605    /// 查询导出任务结果
1606    GetExportTask(String), // ticket
1607    /// 下载导出文件
1608    DownloadExportFile(String), // file_token
1609    /// 上传素材
1610    UploadMedia,
1611    /// 分片上传素材-预上传
1612    UploadMediaPrepare,
1613    /// 分片上传素材-上传分片
1614    UploadMediaPart,
1615    /// 分片上传素材-完成上传
1616    UploadMediaFinish,
1617    /// 下载素材
1618    DownloadMedia(String), // file_token
1619    /// 获取素材临时下载链接
1620    GetMediaTempDownloadUrls,
1621    /// 创建文档版本
1622    CreateFileVersion(String), // file_token
1623    /// 获取文档版本列表
1624    ListFileVersions(String), // file_token
1625    /// 获取文档版本信息
1626    GetFileVersion(String, String), // file_token, version_id
1627    /// 删除文档版本
1628    DeleteFileVersion(String, String), // file_token, version_id
1629    /// 订阅云文档事件
1630    SubscribeFile(String), // file_token
1631    /// 查询云文档事件订阅状态
1632    GetFileSubscribe(String), // file_token
1633    /// 取消云文档事件订阅
1634    DeleteFileSubscribe(String), // file_token
1635    /// 增加协作者权限
1636    CreatePermissionMember(String), // token
1637    /// 批量增加协作者权限
1638    BatchCreatePermissionMember(String), // token
1639    /// 更新协作者权限
1640    UpdatePermissionMember(String, String), // token, member_id
1641    /// 获取云文档协作者
1642    ListPermissionMembers(String), // token
1643    /// 移除云文档协作者权限
1644    DeletePermissionMember(String, String), // token, member_id
1645    /// 转移云文档所有者
1646    TransferOwner(String), // token
1647    /// 判断用户云文档权限
1648    AuthPermissionMember(String), // token
1649    /// 更新云文档权限设置
1650    UpdatePublicPermission(String), // token
1651    /// 获取云文档权限设置
1652    GetPublicPermission(String), // token
1653    /// 启用云文档密码
1654    CreatePublicPassword(String), // token
1655    /// 刷新云文档密码
1656    UpdatePublicPassword(String), // token
1657    /// 停用云文档密码
1658    DeletePublicPassword(String), // token
1659    /// 获取云文档所有评论
1660    ListFileComments(String), // file_token
1661    /// 批量获取评论
1662    BatchQueryComments(String), // file_token
1663    /// 解决/恢复评论
1664    PatchComment(String, String), // file_token, comment_id
1665    /// 添加全文评论
1666    CreateComment(String), // file_token
1667    /// 获取全文评论
1668    GetComment(String, String), // file_token, comment_id
1669    /// 获取回复信息
1670    ListCommentReplies(String, String), // file_token, comment_id
1671    /// 更新回复的内容
1672    UpdateCommentReply(String, String, String), // file_token, comment_id, reply_id
1673    /// 删除回复
1674    DeleteCommentReply(String, String, String), // file_token, comment_id, reply_id
1675    /// 获取订阅状态
1676    GetFileSubscription(String, String), // file_token, subscription_id
1677    /// 创建订阅
1678    CreateFileSubscription(String), // file_token
1679    /// 更新订阅状态
1680    UpdateFileSubscription(String, String), // file_token, subscription_id
1681
1682    // V2 APIs
1683    /// 获取云文档的点赞者列表
1684    ListFileLikes(String), // file_token
1685    /// 获取云文档权限设置(v2)
1686    GetPublicPermissionV2(String), // token
1687    /// 更新云文档权限设置(v2)
1688    UpdatePublicPermissionV2(String), // token
1689
1690    // Media Upload Task APIs
1691    /// 创建媒体上传任务
1692    MediaUploadTasks,
1693    /// 获取媒体上传任务
1694    MediaUploadTask(String), // task_id
1695    /// 创建媒体分享链接
1696    CreateMediaShareLink(String), // file_token
1697    /// 获取公开密码
1698    GetPublicPassword(String), // file_token
1699}
1700
1701impl DriveApi {
1702    /// 生成对应的 URL
1703    pub fn to_url(&self) -> String {
1704        match self {
1705            // V1 File APIs
1706            DriveApi::ListFiles => "/open-apis/drive/v1/files".to_string(),
1707            DriveApi::CreateFolder => "/open-apis/drive/v1/files/create_folder".to_string(),
1708            DriveApi::TaskCheck => "/open-apis/drive/v1/files/task_check".to_string(),
1709            DriveApi::BatchQueryMetas => "/open-apis/drive/v1/metas/batch_query".to_string(),
1710            DriveApi::GetFileStatistics(file_token) => {
1711                format!("/open-apis/drive/v1/files/{}/statistics", file_token)
1712            }
1713            DriveApi::ListFileViewRecords(file_token) => {
1714                format!("/open-apis/drive/v1/files/{}/view_records", file_token)
1715            }
1716            DriveApi::CopyFile(file_token) => {
1717                format!("/open-apis/drive/v1/files/{}/copy", file_token)
1718            }
1719            DriveApi::MoveFile(file_token) => {
1720                format!("/open-apis/drive/v1/files/{}/move", file_token)
1721            }
1722            DriveApi::DeleteFile(file_token) => {
1723                format!("/open-apis/drive/v1/files/{}", file_token)
1724            }
1725            DriveApi::CreateShortcut => "/open-apis/drive/v1/files/create_shortcut".to_string(),
1726            DriveApi::UploadFile => "/open-apis/drive/v1/files/upload_all".to_string(),
1727            DriveApi::UploadPrepare => "/open-apis/drive/v1/files/upload_prepare".to_string(),
1728            DriveApi::UploadPart => "/open-apis/drive/v1/files/upload_part".to_string(),
1729            DriveApi::UploadFinish => "/open-apis/drive/v1/files/upload_finish".to_string(),
1730            DriveApi::DownloadFile(file_token) => {
1731                format!("/open-apis/drive/v1/files/{}/download", file_token)
1732            }
1733
1734            // Import/Export Task APIs
1735            DriveApi::CreateImportTask => "/open-apis/drive/v1/import_tasks".to_string(),
1736            DriveApi::GetImportTask(ticket) => {
1737                format!("/open-apis/drive/v1/import_tasks/{}", ticket)
1738            }
1739            DriveApi::CreateExportTask => "/open-apis/drive/v1/export_tasks".to_string(),
1740            DriveApi::GetExportTask(ticket) => {
1741                format!("/open-apis/drive/v1/export_tasks/{}", ticket)
1742            }
1743            DriveApi::DownloadExportFile(file_token) => {
1744                format!(
1745                    "/open-apis/drive/v1/export_tasks/file/{}/download",
1746                    file_token
1747                )
1748            }
1749
1750            // Media APIs
1751            DriveApi::UploadMedia => "/open-apis/drive/v1/medias/upload_all".to_string(),
1752            DriveApi::UploadMediaPrepare => "/open-apis/drive/v1/medias/upload_prepare".to_string(),
1753            DriveApi::UploadMediaPart => "/open-apis/drive/v1/medias/upload_part".to_string(),
1754            DriveApi::UploadMediaFinish => "/open-apis/drive/v1/medias/upload_finish".to_string(),
1755            DriveApi::DownloadMedia(file_token) => {
1756                format!("/open-apis/drive/v1/medias/{}/download", file_token)
1757            }
1758            DriveApi::GetMediaTempDownloadUrls => {
1759                "/open-apis/drive/v1/medias/batch_get_tmp_download_url".to_string()
1760            }
1761
1762            // File Version APIs
1763            DriveApi::CreateFileVersion(file_token) => {
1764                format!("/open-apis/drive/v1/files/{}/versions", file_token)
1765            }
1766            DriveApi::ListFileVersions(file_token) => {
1767                format!("/open-apis/drive/v1/files/{}/versions", file_token)
1768            }
1769            DriveApi::GetFileVersion(file_token, version_id) => {
1770                format!(
1771                    "/open-apis/drive/v1/files/{}/versions/{}",
1772                    file_token, version_id
1773                )
1774            }
1775            DriveApi::DeleteFileVersion(file_token, version_id) => {
1776                format!(
1777                    "/open-apis/drive/v1/files/{}/versions/{}",
1778                    file_token, version_id
1779                )
1780            }
1781
1782            // Subscription APIs
1783            DriveApi::SubscribeFile(file_token) => {
1784                format!("/open-apis/drive/v1/files/{}/subscribe", file_token)
1785            }
1786            DriveApi::GetFileSubscribe(file_token) => {
1787                format!("/open-apis/drive/v1/files/{}/get_subscribe", file_token)
1788            }
1789            DriveApi::DeleteFileSubscribe(file_token) => {
1790                format!("/open-apis/drive/v1/files/{}/delete_subscribe", file_token)
1791            }
1792
1793            // Permission Member APIs
1794            DriveApi::CreatePermissionMember(token) => {
1795                format!("/open-apis/drive/v1/permissions/{}/members", token)
1796            }
1797            DriveApi::BatchCreatePermissionMember(token) => {
1798                format!(
1799                    "/open-apis/drive/v1/permissions/{}/members/batch_create",
1800                    token
1801                )
1802            }
1803            DriveApi::UpdatePermissionMember(token, member_id) => {
1804                format!(
1805                    "/open-apis/drive/v1/permissions/{}/members/{}",
1806                    token, member_id
1807                )
1808            }
1809            DriveApi::ListPermissionMembers(token) => {
1810                format!("/open-apis/drive/v1/permissions/{}/members", token)
1811            }
1812            DriveApi::DeletePermissionMember(token, member_id) => {
1813                format!(
1814                    "/open-apis/drive/v1/permissions/{}/members/{}",
1815                    token, member_id
1816                )
1817            }
1818            DriveApi::TransferOwner(token) => {
1819                format!(
1820                    "/open-apis/drive/v1/permissions/{}/members/transfer_owner",
1821                    token
1822                )
1823            }
1824            DriveApi::AuthPermissionMember(token) => {
1825                format!("/open-apis/drive/v1/permissions/{}/members/auth", token)
1826            }
1827
1828            // Permission Public APIs
1829            DriveApi::UpdatePublicPermission(token) => {
1830                format!("/open-apis/drive/v1/permissions/{}/public", token)
1831            }
1832            DriveApi::GetPublicPermission(token) => {
1833                format!("/open-apis/drive/v1/permissions/{}/public", token)
1834            }
1835            DriveApi::CreatePublicPassword(token) => {
1836                format!("/open-apis/drive/v1/permissions/{}/public/password", token)
1837            }
1838            DriveApi::UpdatePublicPassword(token) => {
1839                format!("/open-apis/drive/v1/permissions/{}/public/password", token)
1840            }
1841            DriveApi::DeletePublicPassword(token) => {
1842                format!("/open-apis/drive/v1/permissions/{}/public/password", token)
1843            }
1844
1845            // Comment APIs
1846            DriveApi::ListFileComments(file_token) => {
1847                format!("/open-apis/drive/v1/files/{}/comments", file_token)
1848            }
1849            DriveApi::BatchQueryComments(file_token) => {
1850                format!(
1851                    "/open-apis/drive/v1/files/{}/comments/batch_query",
1852                    file_token
1853                )
1854            }
1855            DriveApi::PatchComment(file_token, comment_id) => {
1856                format!(
1857                    "/open-apis/drive/v1/files/{}/comments/{}",
1858                    file_token, comment_id
1859                )
1860            }
1861            DriveApi::CreateComment(file_token) => {
1862                format!("/open-apis/drive/v1/files/{}/comments", file_token)
1863            }
1864            DriveApi::GetComment(file_token, comment_id) => {
1865                format!(
1866                    "/open-apis/drive/v1/files/{}/comments/{}",
1867                    file_token, comment_id
1868                )
1869            }
1870            DriveApi::ListCommentReplies(file_token, comment_id) => {
1871                format!(
1872                    "/open-apis/drive/v1/files/{}/comments/{}/replies",
1873                    file_token, comment_id
1874                )
1875            }
1876            DriveApi::UpdateCommentReply(file_token, comment_id, reply_id) => {
1877                format!(
1878                    "/open-apis/drive/v1/files/{}/comments/{}/replies/{}",
1879                    file_token, comment_id, reply_id
1880                )
1881            }
1882            DriveApi::DeleteCommentReply(file_token, comment_id, reply_id) => {
1883                format!(
1884                    "/open-apis/drive/v1/files/{}/comments/{}/replies/{}",
1885                    file_token, comment_id, reply_id
1886                )
1887            }
1888
1889            // File Subscription APIs
1890            DriveApi::GetFileSubscription(file_token, subscription_id) => {
1891                format!(
1892                    "/open-apis/drive/v1/files/{}/subscriptions/{}",
1893                    file_token, subscription_id
1894                )
1895            }
1896            DriveApi::CreateFileSubscription(file_token) => {
1897                format!("/open-apis/drive/v1/files/{}/subscriptions", file_token)
1898            }
1899            DriveApi::UpdateFileSubscription(file_token, subscription_id) => {
1900                format!(
1901                    "/open-apis/drive/v1/files/{}/subscriptions/{}",
1902                    file_token, subscription_id
1903                )
1904            }
1905
1906            // V2 APIs
1907            DriveApi::ListFileLikes(file_token) => {
1908                format!("/open-apis/drive/v2/files/{}/likes", file_token)
1909            }
1910            DriveApi::GetPublicPermissionV2(token) => {
1911                format!("/open-apis/drive/v2/permissions/{}/public", token)
1912            }
1913            DriveApi::UpdatePublicPermissionV2(token) => {
1914                format!("/open-apis/drive/v2/permissions/{}/public", token)
1915            }
1916
1917            // Media Upload Task APIs
1918            DriveApi::MediaUploadTasks => "/open-apis/drive/v1/medias/upload_tasks".to_string(),
1919            DriveApi::MediaUploadTask(task_id) => {
1920                format!("/open-apis/drive/v1/medias/upload_tasks/{}", task_id)
1921            }
1922            DriveApi::CreateMediaShareLink(file_token) => {
1923                format!("/open-apis/drive/v1/medias/{}/share_link", file_token)
1924            }
1925            DriveApi::GetPublicPassword(file_token) => {
1926                format!("/open-apis/drive/v1/publics/{}/password", file_token)
1927            }
1928        }
1929    }
1930}
1931
1932/// Wiki API 端点枚举
1933#[derive(Debug, Clone, PartialEq)]
1934pub enum WikiApi {
1935    // Space APIs
1936    /// 获取知识空间列表
1937    ListSpaces,
1938    /// 获取知识空间信息
1939    GetSpace,
1940    /// 创建知识空间
1941    CreateSpace,
1942
1943    // Space Member APIs
1944    /// 获取知识空间成员列表
1945    ListSpaceMembers(String), // space_id
1946    /// 添加知识空间成员
1947    CreateSpaceMember(String), // space_id
1948    /// 删除知识空间成员
1949    DeleteSpaceMember(String, String), // space_id, member_id
1950
1951    // Space Setting APIs
1952    /// 更新知识空间设置
1953    UpdateSpaceSetting(String), // space_id
1954
1955    // Space Node APIs
1956    /// 创建知识空间节点
1957    CreateSpaceNode(String), // space_id
1958    /// 获取知识空间节点信息
1959    GetSpaceNode,
1960    /// 获取知识空间子节点列表
1961    ListSpaceNodes,
1962    /// 移动知识空间节点
1963    MoveSpaceNode(String, String), // space_id, node_token
1964    /// 更新知识空间节点标题
1965    UpdateSpaceNodeTitle(String, String), // space_id, node_token
1966    /// 创建知识空间节点副本
1967    CopySpaceNode(String, String), // space_id, node_token
1968    /// 移动云空间文档至知识空间
1969    MoveDocsToWiki(String), // space_id
1970
1971    // Task APIs
1972    /// 获取任务结果
1973    GetTask(String), // task_id
1974
1975    // Node Search API (V1)
1976    /// 搜索Wiki节点
1977    SearchNodes,
1978}
1979
1980impl WikiApi {
1981    /// 生成对应的 URL
1982    pub fn to_url(&self) -> String {
1983        match self {
1984            // Space APIs
1985            WikiApi::ListSpaces => "/open-apis/wiki/v2/spaces".to_string(),
1986            WikiApi::GetSpace => "/open-apis/wiki/v2/spaces/get_node".to_string(),
1987            WikiApi::CreateSpace => "/open-apis/wiki/v2/spaces".to_string(),
1988
1989            // Space Member APIs
1990            WikiApi::ListSpaceMembers(space_id) => {
1991                format!("/open-apis/wiki/v2/spaces/{}/members", space_id)
1992            }
1993            WikiApi::CreateSpaceMember(space_id) => {
1994                format!("/open-apis/wiki/v2/spaces/{}/members", space_id)
1995            }
1996            WikiApi::DeleteSpaceMember(space_id, member_id) => {
1997                format!(
1998                    "/open-apis/wiki/v2/spaces/{}/members/{}",
1999                    space_id, member_id
2000                )
2001            }
2002
2003            // Space Setting APIs
2004            WikiApi::UpdateSpaceSetting(space_id) => {
2005                format!("/open-apis/wiki/v2/spaces/{}/setting", space_id)
2006            }
2007
2008            // Space Node APIs
2009            WikiApi::CreateSpaceNode(space_id) => {
2010                format!("/open-apis/wiki/v2/spaces/{}/nodes", space_id)
2011            }
2012            WikiApi::GetSpaceNode => "/open-apis/wiki/v2/spaces/get_node".to_string(),
2013            WikiApi::ListSpaceNodes => "/open-apis/wiki/v2/space.node/list".to_string(),
2014            WikiApi::MoveSpaceNode(space_id, node_token) => {
2015                format!(
2016                    "/open-apis/wiki/v2/spaces/{}/nodes/{}/move",
2017                    space_id, node_token
2018                )
2019            }
2020            WikiApi::UpdateSpaceNodeTitle(space_id, node_token) => {
2021                format!(
2022                    "/open-apis/wiki/v2/spaces/{}/nodes/{}/update_title",
2023                    space_id, node_token
2024                )
2025            }
2026            WikiApi::CopySpaceNode(space_id, node_token) => {
2027                format!(
2028                    "/open-apis/wiki/v2/spaces/{}/nodes/{}/copy",
2029                    space_id, node_token
2030                )
2031            }
2032            WikiApi::MoveDocsToWiki(space_id) => {
2033                format!(
2034                    "/open-apis/wiki/v2/spaces/{}/nodes/move_docs_to_wiki",
2035                    space_id
2036                )
2037            }
2038
2039            // Task APIs
2040            WikiApi::GetTask(task_id) => {
2041                format!("/open-apis/wiki/v2/tasks/{}", task_id)
2042            }
2043
2044            // Node Search API (V1)
2045            WikiApi::SearchNodes => "/open-apis/wiki/v1/nodes/search".to_string(),
2046        }
2047    }
2048}
2049
2050/// Sheets API v3 端点枚举
2051/// 对应 meta.project = sheets, meta.version = v3
2052#[derive(Debug, Clone, PartialEq)]
2053pub enum SheetsApiV3 {
2054    // =====================
2055    // spreadsheet
2056    // =====================
2057    /// 创建电子表格
2058    CreateSpreadsheet,
2059    /// 获取电子表格信息
2060    GetSpreadsheet(String), // spreadsheet_token
2061    /// 修改电子表格属性
2062    PatchSpreadsheet(String), // spreadsheet_token
2063
2064    // =====================
2065    // spreadsheet.sheet
2066    // =====================
2067    /// 获取工作表列表
2068    QuerySheets(String), // spreadsheet_token
2069    /// 查询工作表
2070    GetSheet(String, String), // (spreadsheet_token, sheet_id)
2071    /// 移动行列
2072    MoveDimension(String, String), // (spreadsheet_token, sheet_id)
2073    /// 查找单元格
2074    FindCells(String, String), // (spreadsheet_token, sheet_id)
2075    /// 替换单元格
2076    ReplaceCells(String, String), // (spreadsheet_token, sheet_id)
2077
2078    // =====================
2079    // spreadsheet.sheet.filter
2080    // =====================
2081    /// 创建筛选
2082    CreateFilter(String, String), // (spreadsheet_token, sheet_id)
2083    /// 更新筛选
2084    UpdateFilter(String, String), // (spreadsheet_token, sheet_id)
2085    /// 获取筛选
2086    GetFilter(String, String), // (spreadsheet_token, sheet_id)
2087    /// 删除筛选
2088    DeleteFilter(String, String), // (spreadsheet_token, sheet_id)
2089
2090    // =====================
2091    // spreadsheet.sheet.filter_view
2092    // =====================
2093    /// 创建筛选视图
2094    CreateFilterView(String, String), // (spreadsheet_token, sheet_id)
2095    /// 查询筛选视图
2096    QueryFilterViews(String, String), // (spreadsheet_token, sheet_id)
2097    /// 获取筛选视图
2098    GetFilterView(String, String, String), // (spreadsheet_token, sheet_id, filter_view_id)
2099    /// 更新筛选视图
2100    PatchFilterView(String, String, String), // (spreadsheet_token, sheet_id, filter_view_id)
2101    /// 删除筛选视图
2102    DeleteFilterView(String, String, String), // (spreadsheet_token, sheet_id, filter_view_id)
2103
2104    // =====================
2105    // spreadsheet.sheet.filter_view.condition
2106    // =====================
2107    /// 创建筛选条件
2108    CreateFilterCondition(String, String, String), // (spreadsheet_token, sheet_id, filter_view_id)
2109    /// 查询筛选条件
2110    QueryFilterConditions(String, String, String), // (spreadsheet_token, sheet_id, filter_view_id)
2111    /// 获取筛选条件
2112    GetFilterCondition(String, String, String, String), // (spreadsheet_token, sheet_id, filter_view_id, condition_id)
2113    /// 更新筛选条件
2114    UpdateFilterCondition(String, String, String, String), // (spreadsheet_token, sheet_id, filter_view_id, condition_id)
2115    /// 删除筛选条件
2116    DeleteFilterCondition(String, String, String, String), // (spreadsheet_token, sheet_id, filter_view_id, condition_id)
2117
2118    // =====================
2119    // spreadsheet.sheet.float_image
2120    // =====================
2121    /// 创建浮动图片
2122    CreateFloatImage(String, String), // (spreadsheet_token, sheet_id)
2123    /// 查询浮动图片
2124    QueryFloatImages(String, String), // (spreadsheet_token, sheet_id)
2125    /// 获取浮动图片
2126    GetFloatImage(String, String, String), // (spreadsheet_token, sheet_id, float_image_id)
2127    /// 更新浮动图片
2128    PatchFloatImage(String, String, String), // (spreadsheet_token, sheet_id, float_image_id)
2129    /// 删除浮动图片
2130    DeleteFloatImage(String, String, String), // (spreadsheet_token, sheet_id, float_image_id)
2131}
2132
2133impl SheetsApiV3 {
2134    /// 生成对应的 URL
2135    pub fn to_url(&self) -> String {
2136        match self {
2137            SheetsApiV3::CreateSpreadsheet => "/open-apis/sheets/v3/spreadsheets".to_string(),
2138            SheetsApiV3::GetSpreadsheet(spreadsheet_token) => {
2139                format!("/open-apis/sheets/v3/spreadsheets/{}", spreadsheet_token)
2140            }
2141            SheetsApiV3::PatchSpreadsheet(spreadsheet_token) => {
2142                format!("/open-apis/sheets/v3/spreadsheets/{}", spreadsheet_token)
2143            }
2144
2145            SheetsApiV3::QuerySheets(spreadsheet_token) => format!(
2146                "/open-apis/sheets/v3/spreadsheets/{}/sheets/query",
2147                spreadsheet_token
2148            ),
2149            SheetsApiV3::GetSheet(spreadsheet_token, sheet_id) => format!(
2150                "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}",
2151                spreadsheet_token, sheet_id
2152            ),
2153            SheetsApiV3::MoveDimension(spreadsheet_token, sheet_id) => format!(
2154                "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/move_dimension",
2155                spreadsheet_token, sheet_id
2156            ),
2157            SheetsApiV3::FindCells(spreadsheet_token, sheet_id) => format!(
2158                "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/find",
2159                spreadsheet_token, sheet_id
2160            ),
2161            SheetsApiV3::ReplaceCells(spreadsheet_token, sheet_id) => format!(
2162                "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/replace",
2163                spreadsheet_token, sheet_id
2164            ),
2165
2166            SheetsApiV3::CreateFilter(spreadsheet_token, sheet_id)
2167            | SheetsApiV3::UpdateFilter(spreadsheet_token, sheet_id)
2168            | SheetsApiV3::GetFilter(spreadsheet_token, sheet_id)
2169            | SheetsApiV3::DeleteFilter(spreadsheet_token, sheet_id) => format!(
2170                "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter",
2171                spreadsheet_token, sheet_id
2172            ),
2173
2174            SheetsApiV3::CreateFilterView(spreadsheet_token, sheet_id) => format!(
2175                "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views",
2176                spreadsheet_token, sheet_id
2177            ),
2178            SheetsApiV3::QueryFilterViews(spreadsheet_token, sheet_id) => format!(
2179                "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/query",
2180                spreadsheet_token, sheet_id
2181            ),
2182            SheetsApiV3::GetFilterView(spreadsheet_token, sheet_id, filter_view_id)
2183            | SheetsApiV3::PatchFilterView(spreadsheet_token, sheet_id, filter_view_id)
2184            | SheetsApiV3::DeleteFilterView(spreadsheet_token, sheet_id, filter_view_id) => {
2185                format!(
2186                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/{}",
2187                    spreadsheet_token, sheet_id, filter_view_id
2188                )
2189            }
2190
2191            SheetsApiV3::CreateFilterCondition(spreadsheet_token, sheet_id, filter_view_id) => {
2192                format!(
2193                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/{}/conditions",
2194                    spreadsheet_token, sheet_id, filter_view_id
2195                )
2196            }
2197            SheetsApiV3::QueryFilterConditions(spreadsheet_token, sheet_id, filter_view_id) => {
2198                format!(
2199                "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/{}/conditions/query",
2200                spreadsheet_token, sheet_id, filter_view_id
2201            )
2202            }
2203            SheetsApiV3::GetFilterCondition(
2204                spreadsheet_token,
2205                sheet_id,
2206                filter_view_id,
2207                condition_id,
2208            )
2209            | SheetsApiV3::UpdateFilterCondition(
2210                spreadsheet_token,
2211                sheet_id,
2212                filter_view_id,
2213                condition_id,
2214            )
2215            | SheetsApiV3::DeleteFilterCondition(
2216                spreadsheet_token,
2217                sheet_id,
2218                filter_view_id,
2219                condition_id,
2220            ) => format!(
2221                "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/filter_views/{}/conditions/{}",
2222                spreadsheet_token, sheet_id, filter_view_id, condition_id
2223            ),
2224
2225            SheetsApiV3::CreateFloatImage(spreadsheet_token, sheet_id) => format!(
2226                "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/float_images",
2227                spreadsheet_token, sheet_id
2228            ),
2229            SheetsApiV3::QueryFloatImages(spreadsheet_token, sheet_id) => format!(
2230                "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/float_images/query",
2231                spreadsheet_token, sheet_id
2232            ),
2233            SheetsApiV3::GetFloatImage(spreadsheet_token, sheet_id, float_image_id)
2234            | SheetsApiV3::PatchFloatImage(spreadsheet_token, sheet_id, float_image_id)
2235            | SheetsApiV3::DeleteFloatImage(spreadsheet_token, sheet_id, float_image_id) => {
2236                format!(
2237                    "/open-apis/sheets/v3/spreadsheets/{}/sheets/{}/float_images/{}",
2238                    spreadsheet_token, sheet_id, float_image_id
2239                )
2240            }
2241        }
2242    }
2243}
2244
2245// Sheets API v3 端点
2246pub const SHEETS_API_V3: &str = "/open-apis/sheets/v3";
2247
2248// ============================================================================
2249// Baike API v1 端点定义
2250// ============================================================================
2251
2252/// Baike知识库 API v1 端点
2253#[derive(Debug, Clone, PartialEq)]
2254pub enum BaikeApiV1 {
2255    /// 草稿管理
2256    DraftCreate,
2257    DraftUpdate(String), // draft_id
2258
2259    /// 词条管理
2260    EntityCreate,
2261    EntityUpdate(String), // entity_id
2262    EntityGet(String),    // entity_id
2263    EntityDelete(String), // entity_id
2264    EntityList,
2265    EntityMatch,
2266    EntitySearch,
2267    EntityHighlight,
2268    EntityExtract,
2269
2270    /// 分类管理
2271    ClassificationList,
2272
2273    /// 文件管理
2274    FileUpload,
2275    FileDownload(String), // file_token
2276}
2277
2278impl BaikeApiV1 {
2279    pub fn to_url(&self) -> String {
2280        match self {
2281            BaikeApiV1::DraftCreate => "/open-apis/baike/v1/drafts".to_string(),
2282            BaikeApiV1::DraftUpdate(draft_id) => {
2283                format!("/open-apis/baike/v1/drafts/{}", draft_id)
2284            }
2285            BaikeApiV1::EntityCreate => "/open-apis/baike/v1/entities".to_string(),
2286            BaikeApiV1::EntityUpdate(entity_id) => {
2287                format!("/open-apis/baike/v1/entities/{}", entity_id)
2288            }
2289            BaikeApiV1::EntityGet(entity_id) => {
2290                format!("/open-apis/baike/v1/entities/{}", entity_id)
2291            }
2292            BaikeApiV1::EntityDelete(entity_id) => {
2293                format!("/open-apis/baike/v1/entities/{}", entity_id)
2294            }
2295            BaikeApiV1::EntityList => "/open-apis/baike/v1/entities".to_string(),
2296            BaikeApiV1::EntityMatch => "/open-apis/baike/v1/entities/match".to_string(),
2297            BaikeApiV1::EntitySearch => "/open-apis/baike/v1/entities/search".to_string(),
2298            BaikeApiV1::EntityHighlight => "/open-apis/baike/v1/entities/highlight".to_string(),
2299            BaikeApiV1::EntityExtract => "/open-apis/baike/v1/entities/extract".to_string(),
2300            BaikeApiV1::ClassificationList => "/open-apis/baike/v1/classifications".to_string(),
2301            BaikeApiV1::FileUpload => "/open-apis/baike/v1/files/upload".to_string(),
2302            BaikeApiV1::FileDownload(file_token) => {
2303                format!("/open-apis/baike/v1/files/{}/download", file_token)
2304            }
2305        }
2306    }
2307}
2308
2309// Baike API v1 端点
2310pub const BAIKE_API_V1: &str = "/open-apis/baike/v1";
2311
2312// ============================================================================
2313// Lingo API v1 端点定义
2314// ============================================================================
2315
2316/// Lingo语言服务 API v1 端点
2317#[derive(Debug, Clone, PartialEq)]
2318pub enum LingoApiV1 {
2319    /// 草稿管理
2320    DraftCreate,
2321    DraftUpdate(String), // draft_id
2322
2323    /// 词条管理
2324    EntityCreate,
2325    EntityUpdate(String), // entity_id
2326    EntityDelete(String), // entity_id
2327    EntityGet(String),    // entity_id
2328    EntityList,
2329    EntityMatch,
2330    EntitySearch,
2331    EntityHighlight,
2332    EntityBatchGet,
2333    EntityBatchUpdate,
2334    EntitySearchRecommend,
2335    EntityHistoryGet(String), // entity_id
2336    EntityHistoryList,
2337
2338    /// 分类管理
2339    ClassificationList,
2340
2341    /// 词库管理
2342    RepoList,
2343
2344    /// 文件管理
2345    FileUpload,
2346    FileDownload(String), // file_token
2347
2348    /// 智能处理
2349    GenerateSummary,
2350    ExtractKeywords,
2351    TranslateText,
2352}
2353
2354impl LingoApiV1 {
2355    pub fn to_url(&self) -> String {
2356        match self {
2357            LingoApiV1::DraftCreate => "/open-apis/lingo/v1/drafts".to_string(),
2358            LingoApiV1::DraftUpdate(draft_id) => {
2359                format!("/open-apis/lingo/v1/drafts/{}", draft_id)
2360            }
2361            LingoApiV1::EntityCreate => "/open-apis/lingo/v1/entities".to_string(),
2362            LingoApiV1::EntityUpdate(entity_id) => {
2363                format!("/open-apis/lingo/v1/entities/{}", entity_id)
2364            }
2365            LingoApiV1::EntityDelete(entity_id) => {
2366                format!("/open-apis/lingo/v1/entities/{}", entity_id)
2367            }
2368            LingoApiV1::EntityGet(entity_id) => {
2369                format!("/open-apis/lingo/v1/entities/{}", entity_id)
2370            }
2371            LingoApiV1::EntityList => "/open-apis/lingo/v1/entities".to_string(),
2372            LingoApiV1::EntityMatch => "/open-apis/lingo/v1/entities/match".to_string(),
2373            LingoApiV1::EntitySearch => "/open-apis/lingo/v1/entities/search".to_string(),
2374            LingoApiV1::EntityHighlight => "/open-apis/lingo/v1/entities/highlight".to_string(),
2375            LingoApiV1::EntityBatchGet => "/open-apis/lingo/v1/entities:batchGet".to_string(),
2376            LingoApiV1::EntityBatchUpdate => "/open-apis/lingo/v1/entities:batchUpdate".to_string(),
2377            LingoApiV1::EntitySearchRecommend => {
2378                "/open-apis/lingo/v1/entities:searchRecommend".to_string()
2379            }
2380            LingoApiV1::EntityHistoryGet(entity_id) => {
2381                format!("/open-apis/lingo/v1/entities/{}/history", entity_id)
2382            }
2383            LingoApiV1::EntityHistoryList => "/open-apis/lingo/v1/entityHistory".to_string(),
2384            LingoApiV1::ClassificationList => "/open-apis/lingo/v1/classifications".to_string(),
2385            LingoApiV1::RepoList => "/open-apis/lingo/v1/repos".to_string(),
2386            LingoApiV1::FileUpload => "/open-apis/lingo/v1/files/upload".to_string(),
2387            LingoApiV1::FileDownload(file_token) => {
2388                format!("/open-apis/lingo/v1/files/{}/download", file_token)
2389            }
2390            LingoApiV1::GenerateSummary => "/open-apis/lingo/v1/text:generateSummary".to_string(),
2391            LingoApiV1::ExtractKeywords => "/open-apis/lingo/v1/text:extractKeywords".to_string(),
2392            LingoApiV1::TranslateText => "/open-apis/lingo/v1/text:translate".to_string(),
2393        }
2394    }
2395}
2396
2397// Lingo API v1 端点
2398pub const LINGO_API_V1: &str = "/open-apis/lingo/v1";
2399
2400#[cfg(test)]
2401mod tests {
2402    use super::*;
2403
2404    // ========== BaseApiV2 Tests ==========
2405    #[test]
2406    fn test_base_api_v2_role_create() {
2407        let endpoint = BaseApiV2::RoleCreate("app_token_123".to_string());
2408        assert_eq!(
2409            endpoint.to_url(),
2410            "/open-apis/base/v2/apps/app_token_123/roles"
2411        );
2412    }
2413
2414    #[test]
2415    fn test_base_api_v2_role_update() {
2416        let endpoint =
2417            BaseApiV2::RoleUpdate("app_token_123".to_string(), "role_id_456".to_string());
2418        assert_eq!(
2419            endpoint.to_url(),
2420            "/open-apis/base/v2/apps/app_token_123/roles/role_id_456"
2421        );
2422    }
2423
2424    #[test]
2425    fn test_base_api_v2_role_list() {
2426        let endpoint = BaseApiV2::RoleList("app_token_123".to_string());
2427        assert_eq!(
2428            endpoint.to_url(),
2429            "/open-apis/base/v2/apps/app_token_123/roles"
2430        );
2431    }
2432
2433    #[test]
2434    fn test_base_api_v2_with_special_chars() {
2435        let endpoint = BaseApiV2::RoleCreate("app-token_123".to_string());
2436        assert!(endpoint.to_url().contains("app-token_123"));
2437    }
2438
2439    // ========== BitableApiV1 Tests ==========
2440    #[test]
2441    fn test_bitable_api_v1_app_create() {
2442        let endpoint = BitableApiV1::AppCreate;
2443        assert_eq!(endpoint.to_url(), "/open-apis/bitable/v1/apps");
2444    }
2445
2446    #[test]
2447    fn test_bitable_api_v1_app_copy() {
2448        let endpoint = BitableApiV1::AppCopy("app_token_123".to_string());
2449        assert_eq!(
2450            endpoint.to_url(),
2451            "/open-apis/bitable/v1/apps/app_token_123/copy"
2452        );
2453    }
2454
2455    #[test]
2456    fn test_bitable_api_v1_table_create() {
2457        let endpoint = BitableApiV1::TableCreate("app_token_123".to_string());
2458        assert_eq!(
2459            endpoint.to_url(),
2460            "/open-apis/bitable/v1/apps/app_token_123/tables"
2461        );
2462    }
2463
2464    #[test]
2465    fn test_bitable_api_v1_record_create() {
2466        let endpoint =
2467            BitableApiV1::RecordCreate("app_token_123".to_string(), "table_id_456".to_string());
2468        assert_eq!(
2469            endpoint.to_url(),
2470            "/open-apis/bitable/v1/apps/app_token_123/tables/table_id_456/records"
2471        );
2472    }
2473
2474    #[test]
2475    fn test_bitable_api_v1_field_create() {
2476        let endpoint =
2477            BitableApiV1::FieldCreate("app_token_123".to_string(), "table_id_456".to_string());
2478        assert_eq!(
2479            endpoint.to_url(),
2480            "/open-apis/bitable/v1/apps/app_token_123/tables/table_id_456/fields"
2481        );
2482    }
2483
2484    #[test]
2485    fn test_bitable_api_v1_block_workflow_list() {
2486        let endpoint = BitableApiV1::BlockWorkflowList("app_token_123".to_string());
2487        assert_eq!(
2488            endpoint.to_url(),
2489            "/open-apis/bitable/v1/apps/app_token_123/block_workflows"
2490        );
2491    }
2492
2493    #[test]
2494    fn test_bitable_api_v1_field_group_create() {
2495        let endpoint =
2496            BitableApiV1::FieldGroupCreate("app_token_123".to_string(), "table_id_456".to_string());
2497        assert_eq!(
2498            endpoint.to_url(),
2499            "/open-apis/bitable/v1/apps/app_token_123/tables/table_id_456/field_groups"
2500        );
2501    }
2502
2503    #[test]
2504    fn test_bitable_api_v1_form_upgrade() {
2505        let endpoint = BitableApiV1::FormUpgrade(
2506            "app_token_123".to_string(),
2507            "table_id_456".to_string(),
2508            "form_id_789".to_string(),
2509        );
2510        assert_eq!(
2511            endpoint.to_url(),
2512            "/open-apis/bitable/v1/apps/app_token_123/tables/table_id_456/forms/form_id_789/upgrade"
2513        );
2514    }
2515
2516    #[test]
2517    fn test_bitable_api_v1_view_create() {
2518        let endpoint =
2519            BitableApiV1::ViewCreate("app_token_123".to_string(), "table_id_456".to_string());
2520        assert_eq!(
2521            endpoint.to_url(),
2522            "/open-apis/bitable/v1/apps/app_token_123/tables/table_id_456/views"
2523        );
2524    }
2525
2526    #[test]
2527    fn test_bitable_api_v1_form_get() {
2528        let endpoint = BitableApiV1::FormGet(
2529            "app_token_123".to_string(),
2530            "table_id_456".to_string(),
2531            "form_id_789".to_string(),
2532        );
2533        assert_eq!(
2534            endpoint.to_url(),
2535            "/open-apis/bitable/v1/apps/app_token_123/tables/table_id_456/forms/form_id_789"
2536        );
2537    }
2538
2539    #[test]
2540    fn test_bitable_api_v1_role_member_create() {
2541        let endpoint =
2542            BitableApiV1::RoleMemberCreate("app_token_123".to_string(), "role_id_456".to_string());
2543        assert_eq!(
2544            endpoint.to_url(),
2545            "/open-apis/bitable/v1/apps/app_token_123/roles/role_id_456/members"
2546        );
2547    }
2548
2549    #[test]
2550    fn test_bitable_api_v1_batch_operations() {
2551        let endpoint = BitableApiV1::TableBatchCreate("app_token_123".to_string());
2552        assert!(endpoint.to_url().contains("batch_create"));
2553
2554        let endpoint = BitableApiV1::RecordBatchDelete(
2555            "app_token_123".to_string(),
2556            "table_id_456".to_string(),
2557        );
2558        assert!(endpoint.to_url().contains("batch_delete"));
2559    }
2560
2561    // ========== MinutesApiV1 Tests ==========
2562    #[test]
2563    fn test_minutes_api_v1_get() {
2564        let endpoint = MinutesApiV1::Get("minute_token_123".to_string());
2565        assert_eq!(
2566            endpoint.to_url(),
2567            "/open-apis/minutes/v1/minutes/minute_token_123"
2568        );
2569    }
2570
2571    #[test]
2572    fn test_minutes_api_v1_media_get() {
2573        let endpoint = MinutesApiV1::MediaGet("minute_token_123".to_string());
2574        assert_eq!(
2575            endpoint.to_url(),
2576            "/open-apis/minutes/v1/minutes/minute_token_123/media"
2577        );
2578    }
2579
2580    #[test]
2581    fn test_minutes_api_v1_transcript_get() {
2582        let endpoint = MinutesApiV1::TranscriptGet("minute_token_123".to_string());
2583        assert_eq!(
2584            endpoint.to_url(),
2585            "/open-apis/minutes/v1/minutes/minute_token_123/transcript"
2586        );
2587    }
2588
2589    #[test]
2590    fn test_minutes_api_v1_statistics_get() {
2591        let endpoint = MinutesApiV1::StatisticsGet("minute_token_123".to_string());
2592        assert_eq!(
2593            endpoint.to_url(),
2594            "/open-apis/minutes/v1/minutes/minute_token_123/statistics"
2595        );
2596    }
2597
2598    // ========== WikiApiV1 Tests ==========
2599    #[test]
2600    fn test_wiki_api_v1_node_search() {
2601        let endpoint = WikiApiV1::NodeSearch;
2602        assert_eq!(endpoint.to_url(), "/open-apis/wiki/v1/nodes/search");
2603    }
2604
2605    // ========== DocsApiV1 Tests ==========
2606    #[test]
2607    fn test_docs_api_v1_content_get() {
2608        let endpoint = DocsApiV1::ContentGet;
2609        assert_eq!(endpoint.to_url(), "/open-apis/docs/v1/content");
2610    }
2611
2612    // ========== DocxApiV1 Tests ==========
2613    #[test]
2614    fn test_docx_api_v1_document_create() {
2615        let endpoint = DocxApiV1::DocumentCreate;
2616        assert_eq!(endpoint.to_url(), "/open-apis/docx/v1/documents");
2617    }
2618
2619    #[test]
2620    fn test_docx_api_v1_document_get() {
2621        let endpoint = DocxApiV1::DocumentGet("doc_id_123".to_string());
2622        assert_eq!(endpoint.to_url(), "/open-apis/docx/v1/documents/doc_id_123");
2623    }
2624
2625    #[test]
2626    fn test_docx_api_v1_document_block_list() {
2627        let endpoint = DocxApiV1::DocumentBlockList("doc_id_123".to_string());
2628        assert_eq!(
2629            endpoint.to_url(),
2630            "/open-apis/docx/v1/documents/doc_id_123/blocks"
2631        );
2632    }
2633
2634    #[test]
2635    fn test_docx_api_v1_chat_announcement_get() {
2636        let endpoint = DocxApiV1::ChatAnnouncementGet("chat_id_123".to_string());
2637        assert_eq!(
2638            endpoint.to_url(),
2639            "/open-apis/docx/v1/chats/chat_id_123/announcement"
2640        );
2641    }
2642
2643    #[test]
2644    fn test_docx_api_v1_document_convert() {
2645        let endpoint = DocxApiV1::DocumentConvert;
2646        assert_eq!(
2647            endpoint.to_url(),
2648            "/open-apis/docx/documents/blocks/convert"
2649        );
2650    }
2651
2652    #[test]
2653    fn test_docx_api_v1_document_block_children_create() {
2654        let endpoint = DocxApiV1::DocumentBlockChildrenCreate(
2655            "doc_id_123".to_string(),
2656            "block_id_456".to_string(),
2657        );
2658        assert_eq!(
2659            endpoint.to_url(),
2660            "/open-apis/docx/v1/documents/doc_id_123/blocks/block_id_456/children"
2661        );
2662    }
2663
2664    // ========== WikiApiV2 Tests ==========
2665    #[test]
2666    fn test_wiki_api_v2_space_list() {
2667        let endpoint = WikiApiV2::SpaceList;
2668        assert_eq!(endpoint.to_url(), "/open-apis/wiki/v2/spaces");
2669    }
2670
2671    #[test]
2672    fn test_wiki_api_v2_space_get() {
2673        let endpoint = WikiApiV2::SpaceGet("space_id_123".to_string());
2674        assert_eq!(endpoint.to_url(), "/open-apis/wiki/v2/spaces/space_id_123");
2675    }
2676
2677    #[test]
2678    fn test_wiki_api_v2_space_create() {
2679        let endpoint = WikiApiV2::SpaceCreate;
2680        assert_eq!(endpoint.to_url(), "/open-apis/wiki/v2/spaces");
2681    }
2682
2683    #[test]
2684    fn test_wiki_api_v2_space_node_list() {
2685        let endpoint = WikiApiV2::SpaceNodeList("space_id_123".to_string());
2686        assert_eq!(
2687            endpoint.to_url(),
2688            "/open-apis/wiki/v2/spaces/space_id_123/nodes"
2689        );
2690    }
2691
2692    #[test]
2693    fn test_wiki_api_v2_space_member_delete() {
2694        let endpoint =
2695            WikiApiV2::SpaceMemberDelete("space_id_123".to_string(), "member_id_456".to_string());
2696        assert_eq!(
2697            endpoint.to_url(),
2698            "/open-apis/wiki/v2/spaces/space_id_123/members/member_id_456"
2699        );
2700    }
2701
2702    #[test]
2703    fn test_wiki_api_v2_task_get() {
2704        let endpoint = WikiApiV2::TaskGet("task_id_123".to_string());
2705        assert_eq!(endpoint.to_url(), "/open-apis/wiki/v2/tasks/task_id_123");
2706    }
2707
2708    // ========== CcmDocApiOld Tests ==========
2709    #[test]
2710    fn test_ccm_doc_api_old_create() {
2711        let endpoint = CcmDocApiOld::Create;
2712        assert_eq!(endpoint.to_url(), "/open-apis/doc/v2/create");
2713    }
2714
2715    #[test]
2716    fn test_ccm_doc_api_old_meta() {
2717        let endpoint = CcmDocApiOld::Meta("doc_token_123".to_string());
2718        assert_eq!(endpoint.to_url(), "/open-apis/doc/v2/meta/doc_token_123");
2719    }
2720
2721    #[test]
2722    fn test_ccm_doc_api_old_raw_content() {
2723        let endpoint = CcmDocApiOld::RawContent("doc_token_123".to_string());
2724        assert_eq!(
2725            endpoint.to_url(),
2726            "/open-apis/doc/v2/doc_token_123/raw_content"
2727        );
2728    }
2729
2730    #[test]
2731    fn test_ccm_doc_api_old_batch_update() {
2732        let endpoint = CcmDocApiOld::BatchUpdate("doc_token_123".to_string());
2733        assert_eq!(
2734            endpoint.to_url(),
2735            "/open-apis/doc/v2/doc_token_123/batch_update"
2736        );
2737    }
2738
2739    // ========== CcmDocsApiOld Tests ==========
2740    #[test]
2741    fn test_ccm_docs_api_old_search_object() {
2742        let endpoint = CcmDocsApiOld::SearchObject;
2743        assert_eq!(endpoint.to_url(), "/open-apis/suite/docs-api/search/object");
2744    }
2745
2746    #[test]
2747    fn test_ccm_docs_api_old_meta() {
2748        let endpoint = CcmDocsApiOld::Meta;
2749        assert_eq!(endpoint.to_url(), "/open-apis/suite/docs-api/meta");
2750    }
2751
2752    // ========== CcmDriveExplorerApiOld Tests ==========
2753    #[test]
2754    fn test_ccm_drive_explorer_api_old_root_folder_meta() {
2755        let endpoint = CcmDriveExplorerApiOld::RootFolderMeta;
2756        assert_eq!(
2757            endpoint.to_url(),
2758            "/open-apis/drive/explorer/v2/root_folder/meta"
2759        );
2760    }
2761
2762    #[test]
2763    fn test_ccm_drive_explorer_api_old_folder_meta() {
2764        let endpoint = CcmDriveExplorerApiOld::FolderMeta("folder_token_123".to_string());
2765        assert_eq!(
2766            endpoint.to_url(),
2767            "/open-apis/drive/explorer/v2/folder/folder_token_123/meta"
2768        );
2769    }
2770
2771    #[test]
2772    fn test_ccm_drive_explorer_api_old_file_copy() {
2773        let endpoint = CcmDriveExplorerApiOld::FileCopy("file_token_123".to_string());
2774        assert_eq!(
2775            endpoint.to_url(),
2776            "/open-apis/drive/explorer/v2/file/copy/files/file_token_123"
2777        );
2778    }
2779
2780    // ========== CcmDriveExplorerApi Tests ==========
2781    #[test]
2782    fn test_ccm_drive_explorer_api_root_folder_meta() {
2783        let endpoint = CcmDriveExplorerApi::RootFolderMeta;
2784        assert_eq!(
2785            endpoint.to_url(),
2786            "/open-apis/drive/v1/explorer/root_folder/meta"
2787        );
2788    }
2789
2790    #[test]
2791    fn test_ccm_drive_explorer_api_folder_meta() {
2792        let endpoint = CcmDriveExplorerApi::FolderMeta("folder_token_123".to_string());
2793        assert_eq!(
2794            endpoint.to_url(),
2795            "/open-apis/drive/v1/explorer/folder/folder_token_123/meta"
2796        );
2797    }
2798
2799    #[test]
2800    fn test_ccm_drive_explorer_api_folder() {
2801        let endpoint = CcmDriveExplorerApi::Folder;
2802        assert_eq!(endpoint.to_url(), "/open-apis/drive/v1/explorer/folder");
2803    }
2804
2805    #[test]
2806    fn test_ccm_drive_explorer_api_to_url_with_params() {
2807        let endpoint = CcmDriveExplorerApi::RootFolderMeta;
2808        let params = vec![("key", "value".to_string())];
2809        let url = endpoint.to_url_with_params(&params);
2810        assert!(url.contains("?"));
2811        assert!(url.contains("key=value"));
2812    }
2813
2814    #[test]
2815    fn test_ccm_drive_explorer_api_to_url_with_empty_params() {
2816        let endpoint = CcmDriveExplorerApi::RootFolderMeta;
2817        let params: Vec<(&str, String)> = vec![];
2818        let url = endpoint.to_url_with_params(&params);
2819        assert!(!url.contains("?"));
2820    }
2821
2822    #[test]
2823    fn test_ccm_drive_explorer_api_to_url_with_special_chars() {
2824        let endpoint = CcmDriveExplorerApi::RootFolderMeta;
2825        let params = vec![("query", "hello world".to_string())];
2826        let url = endpoint.to_url_with_params(&params);
2827        assert!(url.contains("%20"));
2828    }
2829
2830    // ========== PermissionApi Tests ==========
2831    #[test]
2832    fn test_permission_api_member_permitted() {
2833        let endpoint = PermissionApi::MemberPermitted;
2834        assert_eq!(
2835            endpoint.to_url(),
2836            "/open-apis/drive/v1/permission/member/permitted"
2837        );
2838    }
2839
2840    #[test]
2841    fn test_permission_api_member_transfer() {
2842        let endpoint = PermissionApi::MemberTransfer;
2843        assert_eq!(
2844            endpoint.to_url(),
2845            "/open-apis/drive/v1/permission/member/transfer"
2846        );
2847    }
2848
2849    #[test]
2850    fn test_permission_api_public() {
2851        let endpoint = PermissionApi::Public;
2852        assert_eq!(
2853            endpoint.to_url(),
2854            "/open-apis/drive/v1/permission/v2/public/"
2855        );
2856    }
2857
2858    // ========== PermissionApiOld Tests ==========
2859    #[test]
2860    fn test_permission_api_old_member_permitted() {
2861        let endpoint = PermissionApiOld::MemberPermitted;
2862        assert_eq!(
2863            endpoint.to_url(),
2864            "/open-apis/drive/v1/permission/member/permitted"
2865        );
2866    }
2867
2868    #[test]
2869    fn test_permission_api_old_public() {
2870        let endpoint = PermissionApiOld::Public;
2871        assert_eq!(
2872            endpoint.to_url(),
2873            "/open-apis/drive/v1/permission/v2/public/"
2874        );
2875    }
2876}