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    /// 启动云原生开发环境,已存在环境则直接打开,否则重新创建开发环境。Start cloud-native dev. Opens existing env or creates a new one.
27    pub async fn post_repo_workspace_start(
28        &self,
29        repo: String,
30        request_data: serde_json::Value,
31    ) -> Result<Value> {
32        let path = format!("/{}/-/workspace/start", repo);
33        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
34        
35
36        
37        let mut request = self.client.request(
38            reqwest::Method::POST,
39            url
40        );
41
42
43
44        request = request.json(&request_data);
45
46        let response = request.send().await?;
47        
48        if response.status().is_success() {
49            let json: Value = response.json().await?;
50            Ok(json)
51        } else {
52            Err(ApiError::HttpError(response.status().as_u16()))
53        }
54    }
55
56    /// 删除我的云原生开发环境。Delete my workspace.
57    pub async fn post_workspace_delete(
58        &self,
59        request_data: serde_json::Value,
60    ) -> Result<Value> {
61        let path = format!("/workspace/delete");
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    /// 根据流水线sn查询云原生开发访问地址。Query cloud-native development access address by pipeline SN.
86    pub async fn get_repo_workspace_detail_sn(
87        &self,
88        repo: String,
89        sn: String,
90    ) -> Result<Value> {
91        let path = format!("/{}/-/workspace/detail/{}", repo, sn);
92        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
93        
94
95                let request = self.client.request(
96            reqwest::Method::GET,
97            url
98        );
99        
100
101
102
103        let response = request.send().await?;
104        
105        if response.status().is_success() {
106            let json: Value = response.json().await?;
107            Ok(json)
108        } else {
109            Err(ApiError::HttpError(response.status().as_u16()))
110        }
111    }
112
113    /// 获取我的云原生开发环境列表。List my workspaces.
114    pub async fn get_workspace_list(
115        &self,
116        branch: Option<String>,
117        end: Option<String>,
118        page: Option<i64>,
119        page_size: Option<i64>,
120        slug: Option<String>,
121        start: Option<String>,
122        status: Option<String>,
123    ) -> Result<Value> {
124        let path = format!("/workspace/list");
125        let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
126        
127        if let Some(value) = branch {
128            url.query_pairs_mut().append_pair("branch", &value.to_string());
129        }
130        if let Some(value) = end {
131            url.query_pairs_mut().append_pair("end", &value.to_string());
132        }
133        if let Some(value) = page {
134            url.query_pairs_mut().append_pair("page", &value.to_string());
135        }
136        if let Some(value) = page_size {
137            url.query_pairs_mut().append_pair("pageSize", &value.to_string());
138        }
139        if let Some(value) = slug {
140            url.query_pairs_mut().append_pair("slug", &value.to_string());
141        }
142        if let Some(value) = start {
143            url.query_pairs_mut().append_pair("start", &value.to_string());
144        }
145        if let Some(value) = status {
146            url.query_pairs_mut().append_pair("status", &value.to_string());
147        }
148
149                let request = self.client.request(
150            reqwest::Method::GET,
151            url
152        );
153        
154
155
156
157        let response = request.send().await?;
158        
159        if response.status().is_success() {
160            let json: Value = response.json().await?;
161            Ok(json)
162        } else {
163            Err(ApiError::HttpError(response.status().as_u16()))
164        }
165    }
166
167}