Skip to main content

xbp_cli/utils/
version.rs

1//! version api utilities
2//!
3//! functions for interacting with the xbp version api
4//! fetches current version and increments version after deployment
5
6use crate::config::ApiConfig;
7use reqwest;
8
9/// fetch version from xbp api
10pub 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    // Try to extract version string from response
28    // The API might return {"version": "1.2.3"} or just "1.2.3"
29    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
43/// increment version via xbp api
44pub 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}