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 endpoints::cloud_docs::*,
11 http::Transport,
12 req_option::RequestOption,
13 SDKResult,
14 },
15 impl_executable_builder_owned,
16};
17
18#[derive(Debug, Serialize, Default)]
20pub struct CreateSpaceRequest {
21 #[serde(skip)]
22 api_request: ApiRequest,
23 name: String,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 description: Option<String>,
28}
29
30impl CreateSpaceRequest {
31 pub fn builder() -> CreateSpaceRequestBuilder {
32 CreateSpaceRequestBuilder::default()
33 }
34
35 pub fn new(name: impl ToString) -> Self {
36 Self {
37 name: name.to_string(),
38 ..Default::default()
39 }
40 }
41}
42
43#[derive(Default)]
44pub struct CreateSpaceRequestBuilder {
45 request: CreateSpaceRequest,
46}
47
48impl CreateSpaceRequestBuilder {
49 pub fn name(mut self, name: impl ToString) -> Self {
51 self.request.name = name.to_string();
52 self
53 }
54
55 pub fn description(mut self, description: impl ToString) -> Self {
57 self.request.description = Some(description.to_string());
58 self
59 }
60
61 pub fn build(mut self) -> CreateSpaceRequest {
62 self.request.api_request.body = serde_json::to_vec(&self.request).unwrap();
63 self.request
64 }
65}
66
67impl_executable_builder_owned!(
68 CreateSpaceRequestBuilder,
69 crate::service::cloud_docs::wiki::v2::space::SpaceService,
70 CreateSpaceRequest,
71 BaseResponse<CreateSpaceResponse>,
72 create
73);
74
75#[derive(Debug, Deserialize)]
77pub struct CreatedSpace {
78 pub space_id: String,
80 pub name: String,
82 #[serde(default)]
84 pub description: Option<String>,
85 pub space_type: Option<String>,
87 pub visibility: Option<String>,
89}
90
91#[derive(Debug, Deserialize)]
93pub struct CreateSpaceResponse {
94 pub space: CreatedSpace,
96}
97
98impl ApiResponseTrait for CreateSpaceResponse {
99 fn data_format() -> ResponseFormat {
100 ResponseFormat::Data
101 }
102}
103
104pub async fn create_space(
106 request: CreateSpaceRequest,
107 config: &Config,
108 option: Option<RequestOption>,
109) -> SDKResult<BaseResponse<CreateSpaceResponse>> {
110 let mut api_req = request.api_request;
111 api_req.http_method = Method::POST;
112 api_req.api_path = WIKI_V2_SPACES.to_string();
113 api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
114
115 let api_resp = Transport::request(api_req, config, option).await?;
116 Ok(api_resp)
117}
118
119#[cfg(test)]
120#[allow(unused_variables, unused_unsafe)]
121mod tests {
122 use super::*;
123
124 #[test]
125 fn test_create_space_request_builder() {
126 let request = CreateSpaceRequest::builder()
127 .name("我的知识空间")
128 .description("这是一个测试知识空间")
129 .build();
130
131 assert_eq!(request.name, "我的知识空间");
132 assert_eq!(
133 request.description,
134 Some("这是一个测试知识空间".to_string())
135 );
136 }
137}