windmill_var 0.5.0

A short description of your crate's functionality.
Documentation
use reqwest::header::{HeaderMap, HeaderValue};
use std::env;
use serde::Deserialize;
use anyhow::{Result, Context, Error};

#[derive(Deserialize)]
struct VariableResponse {
    value: String,
}

pub async fn get_var(
    variable_path_segment: &str,
) -> Result<String, Error> {

    let base_url = env::var("BASE_INTERNAL_URL")
        .context("Failed to read environment variable 'BASE_INTERNAL_URL'")?;
    let workspace = env::var("WM_WORKSPACE")
        .context("Failed to read environment variable 'WM_WORKSPACE'")?;
    let token = env::var("WM_TOKEN")
        .context("Failed to read environment variable 'WM_TOKEN'")?;

    let url = format!(
        "{}/api/w/{}/variables/get/{}",
        base_url,
        workspace,
        variable_path_segment
    );

    let mut headers = HeaderMap::new();
    let auth_value = format!("Bearer {}", token);
    headers.insert(
        "Authorization",
        HeaderValue::from_str(&auth_value)
            .context("Failed to create Authorization header value")?,
    );

    let client = reqwest::Client::new();

    let response = client
        .get(&url)
        .headers(headers)
        .send()
        .await
        .context("HTTP request failed")?;

    let status = response.status();

    if status.is_success() {
        let variable_response: VariableResponse = response.json()
             .await
             .context("Failed to parse JSON response")?;

        Ok(variable_response.value)
    } else {
         let body = response.text().await.unwrap_or_else(|_| "Failed to get error body".to_string());
         eprintln!("API error response (status: {}): {}", status, body);
        Err(anyhow::anyhow!("HTTP request failed with status code {}", status))
    }
}