rust_cnb/
workspace.rs

1//! Workspace API 客户端
2
3use crate::error::{ApiError, Result};
4use reqwest::Client;
5use serde_json::Value;
6use url::Url;
7
8/// Workspace API 客户端
9pub struct WorkspaceClient {
10    base_url: String,
11    client: Client,
12}
13
14impl WorkspaceClient {
15    /// 创建新的 Workspace API 客户端
16    pub fn new(base_url: String, client: Client) -> Self {
17        Self { base_url, client }
18    }
19
20    /// 设置认证信息
21    pub fn with_auth(self, token: &str) -> Self {
22        // 这里可以扩展认证逻辑
23        self
24    }
25
26    /// 删除我的云原生开发环境。Delete my workspace.
27    pub async fn post_workspace_delete(
28        &self,
29        request_data: serde_json::Value,
30    ) -> Result<Value> {
31        let path = format!("/workspace/delete");
32        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
33        
34
35        
36        let mut request = self.client.request(
37            reqwest::Method::POST,
38            url
39        );
40
41
42
43        request = request.json(&request_data);
44
45        let response = request.send().await?;
46        
47        if response.status().is_success() {
48            let json: Value = response.json().await?;
49            Ok(json)
50        } else {
51            Err(ApiError::HttpError(response.status().as_u16()))
52        }
53    }
54
55    /// 启动云原生开发环境,已存在环境则直接打开,否则重新创建开发环境。Start cloud-native dev. Opens existing env or creates a new one.
56    pub async fn post_repo_workspace_start(
57        &self,
58        repo: String,
59        request_data: serde_json::Value,
60    ) -> Result<Value> {
61        let path = format!("/{}/-/workspace/start", repo);
62        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
63        
64
65        
66        let mut request = self.client.request(
67            reqwest::Method::POST,
68            url
69        );
70
71
72
73        request = request.json(&request_data);
74
75        let response = request.send().await?;
76        
77        if response.status().is_success() {
78            let json: Value = response.json().await?;
79            Ok(json)
80        } else {
81            Err(ApiError::HttpError(response.status().as_u16()))
82        }
83    }
84
85    /// 停止/关闭我的云原生开发环境。Stop/close my workspace.
86    pub async fn post_workspace_stop(
87        &self,
88        request_data: serde_json::Value,
89    ) -> Result<Value> {
90        let path = format!("/workspace/stop");
91        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
92        
93
94        
95        let mut request = self.client.request(
96            reqwest::Method::POST,
97            url
98        );
99
100
101
102        request = request.json(&request_data);
103
104        let response = request.send().await?;
105        
106        if response.status().is_success() {
107            let json: Value = response.json().await?;
108            Ok(json)
109        } else {
110            Err(ApiError::HttpError(response.status().as_u16()))
111        }
112    }
113
114    /// 获取我的云原生开发环境列表。List my workspaces.
115    pub async fn get_workspace_list(
116        &self,
117        branch: Option<String>,
118        end: Option<String>,
119        page: Option<i64>,
120        page_size: Option<i64>,
121        slug: Option<String>,
122        start: Option<String>,
123        status: Option<String>,
124    ) -> Result<Value> {
125        let path = format!("/workspace/list");
126        let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
127        
128        if let Some(value) = branch {
129            url.query_pairs_mut().append_pair("branch", &value.to_string());
130        }
131        if let Some(value) = end {
132            url.query_pairs_mut().append_pair("end", &value.to_string());
133        }
134        if let Some(value) = page {
135            url.query_pairs_mut().append_pair("page", &value.to_string());
136        }
137        if let Some(value) = page_size {
138            url.query_pairs_mut().append_pair("pageSize", &value.to_string());
139        }
140        if let Some(value) = slug {
141            url.query_pairs_mut().append_pair("slug", &value.to_string());
142        }
143        if let Some(value) = start {
144            url.query_pairs_mut().append_pair("start", &value.to_string());
145        }
146        if let Some(value) = status {
147            url.query_pairs_mut().append_pair("status", &value.to_string());
148        }
149
150                let request = self.client.request(
151            reqwest::Method::GET,
152            url
153        );
154        
155
156
157
158        let response = request.send().await?;
159        
160        if response.status().is_success() {
161            let json: Value = response.json().await?;
162            Ok(json)
163        } else {
164            Err(ApiError::HttpError(response.status().as_u16()))
165        }
166    }
167
168    /// 根据流水线sn查询云原生开发访问地址。Query cloud-native development access address by pipeline SN.
169    pub async fn get_repo_workspace_detail_sn(
170        &self,
171        repo: String,
172        sn: String,
173    ) -> Result<Value> {
174        let path = format!("/{}/-/workspace/detail/{}", repo, sn);
175        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
176        
177
178                let request = self.client.request(
179            reqwest::Method::GET,
180            url
181        );
182        
183
184
185
186        let response = request.send().await?;
187        
188        if response.status().is_success() {
189            let json: Value = response.json().await?;
190            Ok(json)
191        } else {
192            Err(ApiError::HttpError(response.status().as_u16()))
193        }
194    }
195
196}