xbp 0.6.0

XBP is a build pack and deployment management tool to deploy, rust, nextjs etc and manage the NGINX configs below it
Documentation
//! version api utilities
//!
//! functions for interacting with the xbp version api
//! fetches current version and increments version after deployment

use reqwest;

/// fetch version from xbp api
pub async fn fetch_version(project_name: &str) -> Result<String, String> {
    let url = format!("https://api.xbp.app/version?project_name={}", 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 url = "https://api.xbp.app/version/increment";
    
    let client = reqwest::Client::new();
    let payload = 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(())
}