# Waifu Vault SDK This is the official API bindings for interacting with the [Waifu Vault](https://waifuvault.moe) API. For more information on Terms of Service and usage policy, please refer to the above website. ## Install ```bash cargo add waifuvault ``` # Usage The following interactions are allowed: * [Upload a File](#upload-file) * [Get File Information](#file-info) * [Modify File Options](#modify-file) * [Delete a File](#delete-file) * [Download a File](#download-file) * [Create a Bucket](#create-bucket) * [Delete a Bucket](#delete-bucket) * [Get Bucket Information](#get-bucket) ## Upload a File The following options can be set when creating a `WaifuUploadRequest`: * `file`: Optional value to upload a file from disk * `url`: Optional value to upload content from a URL * `bytes`: Optional value to upload raw bytes * `bucket`: Optional value to upload the file to a specific bucket * `expires`: Optional value to define the expiry time for the content * Valid values are: `m`, `h`, `d` * If not set, the content exists for as long as the retention policy of the service * `hide_filename`: Optional flag to set to hide the filename from the URL generated * `password`: Optional value to set if the content should be encrypted or not * `one_time_download`: Optional flag to set if the content should be deleted after first access ```rust use waifuvault::{ ApiCaller, api::{WaifuUploadRequest, WaifuResponse} }; #[tokio::main] async fn main() -> anyhow::Result<()> { let caller = ApiCaller::new(); // Upload a file from disk let request = WaifuUploadRequest::new() .file("/some/file/path") // Path to a file .password("set a password") // Set a password .one_time_download(true); // Delete after first access let response = caller.upload_file(request).await?; // Upload a file from a URL let request = WaifuUploadRequest::new() .url("https://some-website/image.jpg"); // URL to content let response = caller.upload_file(request).await?; // Upload a file from raw bytes let data = std::fs::read("some/file/path")?; let request = WaifuUploadRequest::new() .bytes(data, "name-to-store.rs"); // Raw file content and name to store on the vault let response = caller.upload_file(request).await?; Ok(()) } ``` ## Get File Information Retrieves information about a file stored with the API This requires a token that is obtained from the response when uploading a file. The following parameters can be set when using the `WaifuGetRequest`: * `token`: The token used to retrieve the file * `formatted`: Optional flag to determine if the expiry time is human-readable ```rust use waifuvault::{ ApiCaller, api::WaifuGetRequest }; #[tokio::main] async fn main() -> anyhow::Result<()> { let caller = ApiCaller::new(); let request = WaifuGetRequest::new("some-waifu-vault-token"); let response = caller.file_info(request).await?; Ok(()) } ``` ## Modify File Options Modifies the options for a stored file in the API The following parameters can be used to update a file's information: * `password`: Sets a new password for a file * If a password already exists, `previous_password` must also be used * `previous_password`: The previous password for the file (required when setting a new password on encrypted content) * `custom_expiry`: Sets a new expiry time for the content * `hide_filename`: Sets the flag to hide the filename from the URL ```rust use waifuvault::{ ApiCaller, api::WaifuModificationRequest }; #[tokio::main] async fn main() -> anyhow::Result<()> { let caller = ApiCaller::new(); let request = WaifuModificationRequest::new("some-waifu-vault-token") .password("new_password") // Set a new password .previous_password("old_password") // Old password .custom_expiry("1h") // Set a new expiry .hide_filename(true); // Hide the filename let response = caller.update_file(request).await?; // Do something with the response Ok(()) } ``` ## Delete a File Deletes a file using the API denoted by the content token. ```rust,no_run use waifuvault::ApiCaller; #[tokio::main] async fn main() -> anyhow::Result<()> { let caller = ApiCaller::new(); let response = caller.delete_file("some-waifu-token").await?; Ok(()) } ``` ## Download a File Downloads a file from the API with the given token ```rust use waifuvault::ApiCaller; use std::io::Write; #[tokio::main] async fn main() -> anyhow::Result<()> { let caller = ApiCaller::new(); // Download a file with no password let content = caller.download_file("https://waifuvault.moe/f/some-file.ext", None).await?; let mut f = std::fs::File::create("downloaded_file.txt")?; f.write_all(&content)?; // Download a file with no password let content = caller.download_file("https://waifuvault.moe/f/some-other-file.ext", Some("password".to_string())).await?; let mut f = std::fs::File::create("downloaded_file2.txt")?; f.write_all(&content)?; Ok(()) } ``` ## Create a Bucket Creates a new bucket with the API to upload files to ```rust use waifuvault::{ApiCaller, api::WaifuUploadRequest}; #[tokio::main] async fn main() -> anyhow::Result<()> { let caller = ApiCaller::new(); // Create a new bucket to upload files to let bucket = caller.create_bucket().await?; // You can now use the bucket token to upload files to the bucket let request = WaifuUploadRequest::new() .file("/some/file/path") .bucket(&bucket.token) .password("set a password") .one_time_download(true); let response = caller.upload_file(request).await?; // Do something with the response Ok(()) } ``` ## Delete a Bucket Delete a bucket and all the files contained within it. The following parameters are required: * `token`: The bucket token for the bucket to delete ```rust use waifuvault::ApiCaller; #[tokio::main] async fn main() -> anyhow::Result<()> { let caller = ApiCaller::new(); let token = "some-bucket-token"; // Delete the bucket and all files within caller.delete_bucket(token).await?; Ok(()) } ``` ## Get Bucket Information Retrieve information about files contained within a bucket. The following parameters are required: * `token`: The bucket token for the bucket to inspect ```rust use waifuvault::ApiCaller; #[tokio::main] async fn main() -> anyhow::Result<()> { let caller = ApiCaller::new(); let token = "some-bucket-token"; // Get bucket information let info = caller.get_bucket(token).await?; // You can now get access to the file information for files inside the bucket for file in info.files.iter() { // Do something with the file information } Ok(()) } ```