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))
}
}