use openscript::{Value, Error, Result};
use reqwest::Client;
use std::collections::HashMap;
pub async fn http_get(url: &str, headers: HashMap<String, String>) -> Result<Value> {
let client = Client::new();
let mut request = client.get(url);
for (key, value) in headers {
request = request.header(&key, &value);
}
match request.send().await {
Ok(response) => {
let status = response.status().as_u16();
let text = response.text().await
.map_err(|e| Error::runtime_error(format!("Failed to read response: {}", e)))?;
let mut result = HashMap::new();
result.insert("status".to_string(), Value::Number(status as f64));
result.insert("body".to_string(), Value::String(text));
Ok(Value::Object(result.into_iter().collect()))
}
Err(e) => Err(Error::runtime_error(format!("HTTP request failed: {}", e))),
}
}
pub async fn http_post(url: &str, body: &str, headers: HashMap<String, String>) -> Result<Value> {
let client = Client::new();
let mut request = client.post(url).body(body.to_string());
for (key, value) in headers {
request = request.header(&key, &value);
}
match request.send().await {
Ok(response) => {
let status = response.status().as_u16();
let text = response.text().await
.map_err(|e| Error::runtime_error(format!("Failed to read response: {}", e)))?;
let mut result = HashMap::new();
result.insert("status".to_string(), Value::Number(status as f64));
result.insert("body".to_string(), Value::String(text));
Ok(Value::Object(result.into_iter().collect()))
}
Err(e) => Err(Error::runtime_error(format!("HTTP request failed: {}", e))),
}
}
pub async fn http_put(url: &str, body: &str, headers: HashMap<String, String>) -> Result<Value> {
let client = Client::new();
let mut request = client.put(url).body(body.to_string());
for (key, value) in headers {
request = request.header(&key, &value);
}
match request.send().await {
Ok(response) => {
let status = response.status().as_u16();
let text = response.text().await
.map_err(|e| Error::runtime_error(format!("Failed to read response: {}", e)))?;
let mut result = HashMap::new();
result.insert("status".to_string(), Value::Number(status as f64));
result.insert("body".to_string(), Value::String(text));
Ok(Value::Object(result.into_iter().collect()))
}
Err(e) => Err(Error::runtime_error(format!("HTTP request failed: {}", e))),
}
}
pub async fn http_delete(url: &str, headers: HashMap<String, String>) -> Result<Value> {
let client = Client::new();
let mut request = client.delete(url);
for (key, value) in headers {
request = request.header(&key, &value);
}
match request.send().await {
Ok(response) => {
let status = response.status().as_u16();
let text = response.text().await
.map_err(|e| Error::runtime_error(format!("Failed to read response: {}", e)))?;
let mut result = HashMap::new();
result.insert("status".to_string(), Value::Number(status as f64));
result.insert("body".to_string(), Value::String(text));
Ok(Value::Object(result.into_iter().collect()))
}
Err(e) => Err(Error::runtime_error(format!("HTTP request failed: {}", e))),
}
}
pub async fn http_patch(url: &str, body: &str, headers: HashMap<String, String>) -> Result<Value> {
let client = Client::new();
let mut request = client.patch(url).body(body.to_string());
for (key, value) in headers {
request = request.header(&key, &value);
}
match request.send().await {
Ok(response) => {
let status = response.status().as_u16();
let text = response.text().await
.map_err(|e| Error::runtime_error(format!("Failed to read response: {}", e)))?;
let mut result = HashMap::new();
result.insert("status".to_string(), Value::Number(status as f64));
result.insert("body".to_string(), Value::String(text));
Ok(Value::Object(result.into_iter().collect()))
}
Err(e) => Err(Error::runtime_error(format!("HTTP request failed: {}", e))),
}
}