# Parcel Wing Rust SDK
Official Rust SDK for the [Parcel Wing](https://parcelwing.com) API.
```toml
[dependencies]
parcelwing = "0.1"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
```
## Send an email
```rust
use parcelwing::{Client, EmailSendRequest};
#[tokio::main]
async fn main() -> Result<(), parcelwing::Error> {
let client = Client::new("pw_live_your_api_key_here")?;
let emails = client
.emails()
.send(
EmailSendRequest::new(
"Parcel Wing <hello@yourdomain.com>",
"you@example.com",
)
.subject("Hello from Parcel Wing")
.html("<strong>It works!</strong>")
.text("It works!"),
)
.await?;
println!("{emails:#?}");
Ok(())
}
```
## Configuration
```rust
use std::time::Duration;
use parcelwing::{Client, ClientOptions};
let client = Client::with_options(ClientOptions {
api_key: "pw_live_your_api_key_here".to_string(),
base_url: Some("https://parcelwing.com".to_string()),
timeout: Some(Duration::from_secs(30)),
default_headers: Default::default(),
})?;
```
Use `base_url` to point the SDK at a local Parcel Wing instance during development.
## Errors
API and network failures return `parcelwing::Error`.
```rust
match client.emails().send(request).await {
Ok(emails) => println!("Queued: {emails:#?}"),
Err(parcelwing::Error::Api(api_error)) => {
eprintln!("Parcel Wing API error: {} ({:?})", api_error.message, api_error.code);
}
Err(error) => eprintln!("Request failed: {error}"),
}
```
## Local development
```bash
cargo test
cargo fmt
cargo clippy --all-targets --all-features
```
## Publishing
This crate is intended to be published to crates.io as:
```bash
cargo publish
```
Once published, users can install it with:
```toml
parcelwing = "0.1"
```