[![Crates.io](https://img.shields.io/crates/v/supabase-storage.svg)](https://crates.io/crates/supabase-storage) [![Workflow Status](https://github.com/thefux/supabase-storage-rust/actions/workflows/rust.yml/badge.svg)](https://github.com/thefux/supabase-storage-rust/actions/workflows/rust.yml/badge.svg?branch=main) # Supabase Storage Client This is a Rust client library for interacting with Supabase Storage, allowing you to perform various operations such as uploading, downloading, and managing files in your Supabase Storage bucket. ## Getting Started To use the Supabase Storage Rust client, you'll need to first create a `Storage` instance with your Supabase configuration. Make sure to set the required environment variables before using the client library. You can use `dotenv` to load the environment variables from a `.env` file. The SupabaseConfig assumes the presence of the variables SUPABASE_URL_STORAGE and SUPABASE_API_KEY, ensuring that both the authorization header and the base URL are appropriately configured. ```rust use supabase_storage::Storage; use supabase_storage::config::SupabaseConfig; use dotenv::dotenv; #[tokio::main] async fn main() { dotenv().ok(); let config = SupabaseConfig::default(); let storage = Storage::new_with_config(config); // Now you can use the `storage` instance to interact with Supabase Storage. } ``` Utilizing the SupabaseConfig struct isn't obligatory. Alternatively, you can manually load the storage URL and API key values. ```rust use reqwest::header::HeaderValue; use supabase_storage::Storage; use serde::Deserialize; #[tokio::main] async fn main() { let url = ""; let api_key = ""; let storage = Storage::new(url); let bucket_name = "thefux"; let response = storage .from() .header("Authorization", HeaderValue::from_str(&format!("Bearer {}", api_key)).unwrap()) .get_bucket_details(bucket_name) .execute() .await .unwrap(); println!("{:?}", response); // Handle the response as needed. } ``` ## get a File To get a file from Supabase Storage, you can use the `get_object` method of the `Storage` instance. ```rust use supabase_storage::Storage; use supabase_storage::config::SupabaseConfig; use dotenv::dotenv; #[tokio::main] async fn main() { dotenv().ok(); let config = SupabaseConfig::default(); let storage = Storage::new_with_config(config); let bucket_name = "thefux"; let object = "test/bitcoin.pdf"; let response = storage .from() .get_object(bucket_name, object) .execute() .await .unwrap(); // Handle the response as needed. } ``` ## Updating an Object You can also update an object in the bucket using the `update_object` method. The update method is only async for now. ```rust use supabase_storage::Storage; use supabase_storage::config::SupabaseConfig; use dotenv::dotenv; #[tokio::main] async fn main() { dotenv().ok(); let config = SupabaseConfig::default(); let storage = Storage::new_with_config(config); let bucket_name = "thefux"; let object = "btc.pdf"; let file_path = "/user/test.pdf"; let response = storage .from() .update_object_async(bucket_name, object, file_path) .await .execute() .await .unwrap() .text() .await .unwrap(); println!("{:?}", response); // Handle the response as needed. } ``` For those who prefer working with objects, rather than using the execute function, the execute_from function can be utilized, allowing for the subsequent parsing of the response. ```rust use dotenv::dotenv; use supabase_storage::Storage; use supabase_storage::config::SupabaseConfig; use serde::Deserialize; #[derive(Debug, Deserialize)] pub struct Response { pub message: String, } #[tokio::main] async fn main() { dotenv().ok(); let config = SupabaseConfig::default(); let storage = Storage::new_with_config(config); let bucket_name = "thefux"; let object = "btc.pdf"; let response = storage .from() .delete_object(bucket_name, object) .execute_from::() .await .unwrap(); println!("{:?}", response); // Handle the response as needed. } ``` ## Contributing Calling all brilliant minds and passionate developers! 🚀 Feel free to join and make a difference in the project! ## License This library is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details. --- Feel free to add more examples and documentation to this readme based on your specific use cases and requirements.