use crate::core::SupabaseClient;
use crate::error::{Result, SupaError};
use serde::Serialize;
use serde_json::Value;
#[derive(Clone)]
pub struct FunctionsClient {
client: SupabaseClient,
}
impl FunctionsClient {
pub(crate) fn new(client: SupabaseClient) -> Self {
Self { client }
}
pub async fn invoke<T: Serialize>(
&self,
function_name: &str,
body: Option<T>,
) -> Result<Value> {
let url = self
.client
.inner
.url
.join(&format!("functions/v1/{}", function_name))?;
let mut req = self
.client
.inner
.http
.post(url)
.header("apikey", &self.client.inner.key)
.header("Authorization", self.client.auth_header());
if let Some(b) = body {
req = req.json(&b);
}
let resp = req.send().await?;
let status = resp.status();
if !status.is_success() {
let error_text = resp.text().await.unwrap_or_default();
return Err(SupaError::FunctionsError {
message: format!("Function invocation failed: {}", error_text),
});
}
let text = resp.text().await?;
if text.is_empty() {
return Ok(Value::Null);
}
match serde_json::from_str::<Value>(&text) {
Ok(v) => Ok(v),
Err(_) => {
Ok(Value::String(text))
}
}
}
}