2 个版本

0.1.1 2024年7月6日
0.1.0 2024年7月6日

网页编程 中排名 417

Download history 166/week @ 2024-07-01 51/week @ 2024-07-08

每月下载量 217

MIT 许可证

20KB
301

supabase-function-rs

概述

supabase-function-rs 是一个用于与 Supabase Edge Functions 交互的 Rust 客户端库。该库提供了一种简单的方法来使用各种 HTTP 方法、头和正文类型调用 Supabase 函数,包括 JSON、纯文本、表单数据、文件上传、blob 和数组缓冲区。它还支持为函数调用设置自定义区域。

功能

  • 使用不同的 HTTP 方法调用 Supabase Edge Functions。
  • 支持各种正文类型:JSON、纯文本、表单数据、文件上传、blob 和数组缓冲区。
  • 支持自定义头。
  • 区域特定的函数调用。
  • 全面的错误处理。

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
supabase-function-rs = "0.1.0"

使用方法

初始化

要开始,使用 Supabase URL 以及可选的头和区域初始化 FunctionsClient

use supabase_function_rs::{FunctionsClient, FunctionRegion};
use std::collections::HashMap;

let url = "https://your-supabase-url";
let mut headers = HashMap::new();
headers.insert("Custom-Header".to_string(), "Header-Value".to_string());

let client = FunctionsClient::new(url.to_string(), Some(headers), Some(FunctionRegion::UsEast1));
client.set_auth("your-jwt-token".to_string());

基本函数调用

use supabase_function_rs::{FunctionInvokeOptions, HttpMethod, InvokeBody, FunctionsResponse, ResponseData};
use serde_json::json;
use std::collections::HashMap;

let mut invoke_options = FunctionInvokeOptions::default();
invoke_options.method = Some(HttpMethod::Post);
let mut json_body = HashMap::new();
json_body.insert("request_key".to_string(), json!("request_value"));
invoke_options.body = Some(InvokeBody::Json(json_body));

match client.invoke("function-name", Some(invoke_options)).await {
    Ok(response) => match response {
        FunctionsResponse::Success { data } => match data {
            ResponseData::Json(json) => {
                println!("Response: {:?}", json);
            }
            _ => panic!("Expected JSON response data"),
        },
        FunctionsResponse::Failure { error } => {
            println!("Function call failed: {}", error);
        }
    },
    Err(e) => {
        println!("Error invoking function: {}", e);
    }
}

不同正文类型的函数调用

纯文本
invoke_options.body = Some(InvokeBody::String("request text".to_string()));
match client.invoke("function-name", Some(invoke_options)).await {
    Ok(response) => { /* Handle response */ },
    Err(e) => { /* Handle error */ }
}
表单数据
let mut form_data = HashMap::new();
form_data.insert("field1".to_string(), "value1".to_string());
form_data.insert("field2".to_string(), "value2".to_string());
invoke_options.body = Some(InvokeBody::FormData(form_data));
match client.invoke("function-name", Some(invoke_options)).await {
    Ok(response) => { /* Handle response */ },
    Err(e) => { /* Handle error */ }
}
文件上传
use std::fs::File;
use std::io::Read;

let path = "test_file.txt";
let mut file = File::open(&path).unwrap();
let mut file_content = Vec::new();
file.read_to_end(&mut file_content).unwrap();
invoke_options.body = Some(InvokeBody::File(file_content));
match client.invoke("function-name", Some(invoke_options)).await {
    Ok(response) => { /* Handle response */ },
    Err(e) => { /* Handle error */ }
}
blob
let blob: Vec<u8> = vec![1, 2, 3, 4, 5]; // Example blob data
invoke_options.body = Some(InvokeBody::Blob(blob));
match client.invoke("function-name", Some(invoke_options)).await {
    Ok(response) => { /* Handle response */ },
    Err(e) => { /* Handle error */ }
}
ArrayBuffer
let array_buffer: Vec<u8> = vec![1, 2, 3, 4, 5]; // Example array buffer data
invoke_options.body = Some(InvokeBody::ArrayBuffer(array_buffer));
match client.invoke("function-name", Some(invoke_options)).await {
    Ok(response) => { /* Handle response */ },
    Err(e) => { /* Handle error */ }
}

设置自定义区域

调用函数时可以指定自定义区域

invoke_options.region = Some(FunctionRegion::UsEast1);
match client.invoke("function-name", Some(invoke_options)).await {
    Ok(response) => { /* Handle response */ },
    Err(e) => { /* Handle error */ }
}

错误处理

库提供了具有特定错误类型的全面错误处理

  • FunctionsFetchError:表示请求发送失败。
  • FunctionsRelayError:表示调用函数时的中继错误。
  • FunctionsHttpError:表示函数返回了非 2xx 状态码。

示例

match client.invoke("function-name", Some(invoke_options)).await {
    Ok(response) => { /* Handle response */ },
    Err(FunctionsError::FetchError(e)) => println!("Fetch error: {}", e),
    Err(FunctionsError::RelayError(e)) => println!("Relay error: {}", e),
    Err(FunctionsError::HttpError(e)) => println!("HTTP error: {}", e),
    Err(e) => println!("Other error: {}", e),
}

测试

要运行测试,使用

cargo test --test functions_client_tests

贡献

请随意提出问题或提交功能、错误修复或改进的 pull request。

许可证

本项目采用 MIT 许可证。有关详细信息,请参阅 LICENSE 文件。

鸣谢

特别感谢贡献者和开源社区的支持和贡献。

依赖关系

~7–18MB
~258K SLoC