parcelwing 0.1.0

Official Rust SDK for the Parcel Wing API.
Documentation
# 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"
```