open_lark/service/cloud_docs/wiki/v2/space/
create.rs1use reqwest::Method;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5 core::{
6 api_req::ApiRequest,
7 api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
8 config::Config,
9 constants::AccessTokenType,
10 http::Transport,
11 req_option::RequestOption,
12 SDKResult,
13 },
14 impl_executable_builder_owned,
15};
16
17#[derive(Debug, Serialize, Default)]
19pub struct CreateSpaceRequest {
20 #[serde(skip)]
21 api_request: ApiRequest,
22 name: String,
24 #[serde(skip_serializing_if = "Option::is_none")]
26 description: Option<String>,
27}
28
29impl CreateSpaceRequest {
30 pub fn builder() -> CreateSpaceRequestBuilder {
31 CreateSpaceRequestBuilder::default()
32 }
33
34 pub fn new(name: impl ToString) -> Self {
35 Self {
36 name: name.to_string(),
37 ..Default::default()
38 }
39 }
40}
41
42#[derive(Default)]
43pub struct CreateSpaceRequestBuilder {
44 request: CreateSpaceRequest,
45}
46
47impl CreateSpaceRequestBuilder {
48 pub fn name(mut self, name: impl ToString) -> Self {
50 self.request.name = name.to_string();
51 self
52 }
53
54 pub fn description(mut self, description: impl ToString) -> Self {
56 self.request.description = Some(description.to_string());
57 self
58 }
59
60 pub fn build(mut self) -> CreateSpaceRequest {
61 self.request.api_request.body = serde_json::to_vec(&self.request).unwrap();
62 self.request
63 }
64}
65
66impl_executable_builder_owned!(
67 CreateSpaceRequestBuilder,
68 crate::service::cloud_docs::wiki::v2::space::SpaceService,
69 CreateSpaceRequest,
70 BaseResponse<CreateSpaceResponse>,
71 create
72);
73
74#[derive(Debug, Deserialize)]
76pub struct CreatedSpace {
77 pub space_id: String,
79 pub name: String,
81 #[serde(default)]
83 pub description: Option<String>,
84 pub space_type: Option<String>,
86 pub visibility: Option<String>,
88}
89
90#[derive(Debug, Deserialize)]
92pub struct CreateSpaceResponse {
93 pub space: CreatedSpace,
95}
96
97impl ApiResponseTrait for CreateSpaceResponse {
98 fn data_format() -> ResponseFormat {
99 ResponseFormat::Data
100 }
101}
102
103pub async fn create_space(
105 request: CreateSpaceRequest,
106 config: &Config,
107 option: Option<RequestOption>,
108) -> SDKResult<BaseResponse<CreateSpaceResponse>> {
109 let mut api_req = request.api_request;
110 api_req.http_method = Method::POST;
111 api_req.api_path = "/open-apis/wiki/v2/spaces".to_string();
112 api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
113
114 let api_resp = Transport::request(api_req, config, option).await?;
115 Ok(api_resp)
116}
117
118#[cfg(test)]
119mod tests {
120 use super::*;
121
122 #[test]
123 fn test_create_space_request_builder() {
124 let request = CreateSpaceRequest::builder()
125 .name("我的知识空间")
126 .description("这是一个测试知识空间")
127 .build();
128
129 assert_eq!(request.name, "我的知识空间");
130 assert_eq!(
131 request.description,
132 Some("这是一个测试知识空间".to_string())
133 );
134 }
135}