xbp 10.12.2

XBP is a zero-config build pack that can also interact with proxies, kafka, sockets, synthetic monitors.
Documentation
//! version api utilities
//!
//! functions for interacting with the xbp version api
//! fetches current version and increments version after deployment

use crate::config::ApiConfig;
use reqwest;

/// fetch version from xbp api
pub async fn fetch_version(project_name: &str) -> Result<String, String> {
    let api_config = ApiConfig::load();
    let url = api_config.version_endpoint(project_name);

    let response = reqwest::get(&url)
        .await
        .map_err(|e| format!("Failed to fetch version from API: {}", e))?;

    if !response.status().is_success() {
        return Err(format!("API returned error status: {}", response.status()));
    }

    let version: serde_json::Value = response
        .json()
        .await
        .map_err(|e| format!("Failed to parse version response: {}", e))?;

    // Try to extract version string from response
    // The API might return {"version": "1.2.3"} or just "1.2.3"
    let version_str = if let Some(v) = version.get("version") {
        v.as_str()
            .ok_or_else(|| "Version field is not a string".to_string())?
    } else if version.is_string() {
        version
            .as_str()
            .ok_or_else(|| "Version is not a string".to_string())?
    } else {
        return Err("Invalid version format in API response".to_string());
    };

    Ok(version_str.to_string())
}

/// increment version via xbp api
pub async fn increment_version(project_name: &str, increment: &str) -> Result<(), String> {
    let api_config = ApiConfig::load();
    let url = api_config.increment_endpoint();

    let client: reqwest::Client = reqwest::Client::new();
    let payload: serde_json::Value = serde_json::json!({
        "project_name": project_name,
        "increment": increment
    });

    let response = client
        .post(url)
        .header("Content-Type", "application/json")
        .json(&payload)
        .send()
        .await
        .map_err(|e| format!("Failed to increment version: {}", e))?;

    if !response.status().is_success() {
        let status = response.status();
        let text = response.text().await.unwrap_or_default();
        return Err(format!(
            "Failed to increment version: {} - {}",
            status, text
        ));
    }

    Ok(())
}