1use crate::error::{ApiError, Result};
4use reqwest::Client;
5use serde_json::Value;
6use url::Url;
7
8pub struct WorkspaceClient {
10 base_url: String,
11 client: Client,
12}
13
14impl WorkspaceClient {
15 pub fn new(base_url: String, client: Client) -> Self {
17 Self { base_url, client }
18 }
19
20 pub fn with_auth(self, token: &str) -> Self {
22 self
24 }
25
26 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 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 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 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 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}