1use crate::config::ApiConfig;
7use reqwest;
8
9pub async fn fetch_version(project_name: &str) -> Result<String, String> {
11 let api_config = ApiConfig::load();
12 let url = api_config.version_endpoint(project_name);
13
14 let response = reqwest::get(&url)
15 .await
16 .map_err(|e| format!("Failed to fetch version from API: {}", e))?;
17
18 if !response.status().is_success() {
19 return Err(format!("API returned error status: {}", response.status()));
20 }
21
22 let version: serde_json::Value = response
23 .json()
24 .await
25 .map_err(|e| format!("Failed to parse version response: {}", e))?;
26
27 let version_str = if let Some(v) = version.get("version") {
30 v.as_str()
31 .ok_or_else(|| "Version field is not a string".to_string())?
32 } else if version.is_string() {
33 version
34 .as_str()
35 .ok_or_else(|| "Version is not a string".to_string())?
36 } else {
37 return Err("Invalid version format in API response".to_string());
38 };
39
40 Ok(version_str.to_string())
41}
42
43pub async fn increment_version(project_name: &str, increment: &str) -> Result<(), String> {
45 let api_config = ApiConfig::load();
46 let url = api_config.increment_endpoint();
47
48 let client: reqwest::Client = reqwest::Client::new();
49 let payload: serde_json::Value = serde_json::json!({
50 "project_name": project_name,
51 "increment": increment
52 });
53
54 let response = client
55 .post(url)
56 .header("Content-Type", "application/json")
57 .json(&payload)
58 .send()
59 .await
60 .map_err(|e| format!("Failed to increment version: {}", e))?;
61
62 if !response.status().is_success() {
63 let status = response.status();
64 let text = response.text().await.unwrap_or_default();
65 return Err(format!(
66 "Failed to increment version: {} - {}",
67 status, text
68 ));
69 }
70
71 Ok(())
72}