Skip to main content

openlark_workflow/v2/custom_field/
create.rs

1//! 创建自定义字段
2//!
3//! docPath: <https://open.feishu.cn/document/server-docs/docs/task-v2/custom_field/create>
4
5use crate::common::{api_endpoints::TaskApiV2, api_utils::*};
6use crate::v2::custom_field::models::{CreateCustomFieldBody, CreateCustomFieldResponse};
7use openlark_core::{
8    SDKResult,
9    api::{ApiRequest, ApiResponseTrait, ResponseFormat},
10    config::Config,
11    validate_required,
12};
13use std::sync::Arc;
14
15/// 创建自定义字段请求
16#[derive(Debug, Clone)]
17pub struct CreateCustomFieldRequest {
18    /// 配置信息
19    config: Arc<Config>,
20    /// 请求体
21    body: CreateCustomFieldBody,
22}
23
24impl CreateCustomFieldRequest {
25    /// 创建新的请求构建器。
26    pub fn new(config: Arc<Config>, resource_id: String) -> Self {
27        Self {
28            config,
29            body: CreateCustomFieldBody {
30                resource_type: "tasklist".to_string(),
31                resource_id,
32                ..CreateCustomFieldBody::default()
33            },
34        }
35    }
36
37    /// 设置字段名称
38    pub fn name(mut self, name: impl Into<String>) -> Self {
39        self.body.name = name.into();
40        self
41    }
42
43    /// 设置字段配置
44    pub fn config(mut self, config: crate::v2::custom_field::models::CustomFieldConfig) -> Self {
45        self.body.config = config;
46        self
47    }
48
49    /// 执行请求
50    pub async fn execute(self) -> SDKResult<CreateCustomFieldResponse> {
51        self.execute_with_options(openlark_core::req_option::RequestOption::default())
52            .await
53    }
54
55    /// 执行请求(带选项)
56    pub async fn execute_with_options(
57        self,
58        option: openlark_core::req_option::RequestOption,
59    ) -> SDKResult<CreateCustomFieldResponse> {
60        // 验证必填字段
61        validate_required!(self.body.resource_id.trim(), "清单GUID不能为空");
62        validate_required!(self.body.name.trim(), "字段名称不能为空");
63
64        let api_endpoint = TaskApiV2::CustomFieldCreate;
65        let mut request = ApiRequest::<CreateCustomFieldResponse>::post(api_endpoint.to_url());
66
67        let request_body = &self.body;
68        request = request.body(serialize_params(request_body, "创建自定义字段")?);
69
70        let response =
71            openlark_core::http::Transport::request(request, &self.config, Some(option)).await?;
72        extract_response_data(response, "创建自定义字段")
73    }
74}
75
76impl ApiResponseTrait for CreateCustomFieldResponse {
77    fn data_format() -> ResponseFormat {
78        ResponseFormat::Data
79    }
80}
81
82#[cfg(test)]
83#[allow(unused_imports)]
84mod tests {
85    use std::sync::Arc;
86
87    use super::*;
88
89    use crate::v2::custom_field::models::{CustomFieldConfig, CustomFieldType};
90
91    #[test]
92    fn test_create_custom_field_builder() {
93        let config = Arc::new(
94            openlark_core::config::Config::builder()
95                .app_id("test")
96                .app_secret("test")
97                .build(),
98        );
99
100        let config_value = CustomFieldConfig {
101            field_type: CustomFieldType::Text,
102            options: None,
103        };
104
105        let request = CreateCustomFieldRequest::new(config, "tasklist_123".to_string())
106            .name("优先级")
107            .config(config_value);
108
109        assert_eq!(request.body.name, "优先级");
110    }
111}