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        openlark_core::http::Transport::request_typed(
71            request,
72            &self.config,
73            Some(option),
74            "创建自定义字段",
75        )
76        .await
77    }
78}
79
80impl ApiResponseTrait for CreateCustomFieldResponse {
81    fn data_format() -> ResponseFormat {
82        ResponseFormat::Data
83    }
84}
85
86#[cfg(test)]
87#[allow(unused_imports)]
88mod tests {
89    use std::sync::Arc;
90
91    use super::*;
92
93    use crate::v2::custom_field::models::{CustomFieldConfig, CustomFieldType};
94
95    #[test]
96    fn test_create_custom_field_builder() {
97        let config = Arc::new(
98            openlark_core::config::Config::builder()
99                .app_id("test")
100                .app_secret("test")
101                .build(),
102        );
103
104        let config_value = CustomFieldConfig {
105            field_type: CustomFieldType::Text,
106            options: None,
107        };
108
109        let request = CreateCustomFieldRequest::new(config, "tasklist_123".to_string())
110            .name("优先级")
111            .config(config_value);
112
113        assert_eq!(request.body.name, "优先级");
114    }
115}