files-sdk

Rust SDK for the Files.com API - 288 endpoints, fully async, type-safe.
Installation
[dependencies]
files-sdk = "0.1"
Quick Start
use files_sdk::{FilesClient, files::FileHandler};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = FilesClient::builder()
.api_key("your-api-key")
.build()?;
let file_handler = FileHandler::new(client);
let data = b"Hello, Files.com!";
file_handler.upload_file("/path/to/file.txt", data).await?;
let content = file_handler.download("/path/to/file.txt").await?;
let (files, _pagination) = file_handler.list_folder("/", None, Some(100)).await?;
for file in files {
println!("{}: {} bytes", file.path, file.size);
}
Ok(())
}
Examples
File Operations
use files_sdk::{FilesClient, files::FileHandler};
let client = FilesClient::builder().api_key("key").build()?;
let handler = FileHandler::new(client);
handler.upload_file_with_options(
"/reports/2024/summary.pdf",
data,
true ).await?;
handler.copy("/original.txt", "/backup.txt").await?;
handler.move_file("/old/path.txt", "/new/path.txt").await?;
handler.delete("/unwanted.txt").await?;
User Management
use files_sdk::{FilesClient, users::UserHandler};
let client = FilesClient::builder().api_key("key").build()?;
let handler = UserHandler::new(client);
let (users, pagination) = handler.list(None, Some(50)).await?;
let user = handler.get(123).await?;
let new_user = handler.create("user@example.com", "username", None).await?;
handler.update(123, Some("new@example.com"), None).await?;
File Sharing
use files_sdk::{FilesClient, sharing::BundleHandler};
let client = FilesClient::builder().api_key("key").build()?;
let handler = BundleHandler::new(client);
let bundle = handler.create(
vec!["/reports/Q4.pdf".to_string()],
None, Some(7) ).await?;
println!("Share URL: {}", bundle.url);
let (bundles, _) = handler.list(None, Some(100)).await?;
Automation
use files_sdk::{FilesClient, automation::AutomationHandler};
let client = FilesClient::builder().api_key("key").build()?;
let handler = AutomationHandler::new(client);
let automation = handler.create(
"folder_sync", Some("/sync/*"), None ).await?;
let (automations, _) = handler.list(None, Some(50), None).await?;
Error Handling
use files_sdk::{FilesClient, FilesError, files::FileHandler};
let client = FilesClient::builder().api_key("key").build()?;
let handler = FileHandler::new(client);
match handler.download("/missing.txt").await {
Ok(content) => println!("Downloaded {} bytes", content.len()),
Err(FilesError::NotFound { message }) => {
eprintln!("File not found: {}", message);
}
Err(FilesError::AuthenticationFailed { message }) => {
eprintln!("Auth failed: {}", message);
}
Err(FilesError::RateLimited { message }) => {
eprintln!("Rate limited: {}", message);
}
Err(e) => eprintln!("Error: {}", e),
}
Tracing (Optional)
Enable HTTP-level debugging:
[dependencies]
files-sdk = { version = "0.1", features = ["tracing"] }
tracing-subscriber = "0.3"
use files_sdk::{FilesClient, files::FileHandler};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt()
.with_env_filter("files_sdk=debug")
.init();
let client = FilesClient::builder().api_key("key").build()?;
let handler = FileHandler::new(client);
handler.upload_file("/test.txt", b"data").await?;
Ok(())
}
RUST_LOG=files_sdk=debug cargo run
API Coverage
Module |
Endpoints |
Description |
files:: |
50+ |
File upload/download, folders, comments |
users:: |
40+ |
Users, groups, permissions, API keys |
sharing:: |
30+ |
Bundles, file requests, inbox uploads |
automation:: |
25+ |
Automations, behaviors, webhooks |
admin:: |
20+ |
Site settings, history, invoices |
logs:: |
30+ |
API logs, SFTP logs, audit trails |
messages:: |
10+ |
Notifications, message exports |
storage:: |
15+ |
Projects, snapshots, locks |
security:: |
10+ |
GPG keys, SFTP host keys |
as2:: |
40+ |
AS2 stations, partners, messages |
advanced:: |
28+ |
Form fields, share groups, SIEM |
Total: 288 endpoints across 90+ handlers
Error Types
pub enum FilesError {
BadRequest { message: String }, AuthenticationFailed { message: String }, Forbidden { message: String }, NotFound { message: String }, Conflict { message: String }, PreconditionFailed { message: String }, UnprocessableEntity { message: String }, Locked { message: String }, RateLimited { message: String }, InternalError { message: String }, Request(reqwest::Error),
JsonError(serde_json::Error),
BuilderError(String),
UrlParseError(url::ParseError),
}
Testing
cargo test --lib
cargo test --test mock
FILES_API_KEY=your_key cargo test --test real --features integration-tests
License
MIT OR Apache-2.0