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_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 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 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 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}