catzconnect 1.0.0

Secure, minimal SDK for sending encrypted communication requests to the CatzConnect API
Documentation
# CatzConnect SDK (Rust)

A secure, minimal SDK for sending encrypted communication requests (e.g., email OTP) to the CatzConnect API.

---

## ✨ Features

* 🔐 End-to-end payload encryption (X25519 ECDH + BLAKE2b-256 + ChaCha20-Poly1305 IETF)
* ⚡ Stateless design — no `init()` required
* 🧠 Automatic payload validation
* 🔑 API key via environment variable (Bearer token)
* 🦀 Pure Rust — no libsodium C dependency

---

## 📦 Installation

Add to your `Cargo.toml`:

```toml
[dependencies]
catzconnect = "1.0.0"
tokio   = { version = "1", features = ["full"] }
dotenvy = "0.15"
```

---

## ⚙️ Environment Setup

Create a `.env` file (or export these variables):

```env
API_KEY=your_api_key
PRIVATE_KEY=your_base64_private_key
SERVER_PUBLIC_KEY=server_base64_public_key
# BASE_URL=https://api.catzconnect.com  # optional
```

> ⚠️ Never expose these values in public environments.

---

## 🚀 Usage

```rust
use catzconnect::{
    CatzConnect,
    types::{Channel, MessageType, SendInput, SendPayload, Template},
};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    dotenvy::dotenv().ok(); // load .env

    let response = CatzConnect::send(SendInput {
        message_type: MessageType::Verification,
        channel:      Channel::Email,
        template:     Template::Otp,
        payload: SendPayload {
            to:  Some("user@example.com".into()),
            otp: Some(123456),
        },
    })
    .await?;

    println!("{response}");
    Ok(())
}
```

---

## 📬 Supported Operation

### Email Verification OTP

```rust
SendInput {
    message_type: MessageType::Verification,
    channel:      Channel::Email,
    template:     Template::Otp,
    payload: SendPayload {
        to:  Some("user@example.com".into()), // required, valid email
        otp: Some(123456),                    // required
    },
}
```

---

## 🔐 How It Works

1. **Validate Input** — ensures required fields are present and the email is valid
2. **Encrypt Payload**
   - X25519 ECDH shared secret: `scalarmult(client_priv, server_pub)`
   - `master  = BLAKE2b-256(shared)`
   - `key_enc = BLAKE2b-256(master || "CONNECT-@-2026-HS-@-CATZ")`
   - ChaCha20-Poly1305 IETF encrypt with a random 12-byte nonce
3. **Send Request**`POST /sdk/send` with `{ nonce, ciphertext }` JSON and `Authorization: Bearer <key>`

---

## ❌ Error Handling

```rust
match CatzConnect::send(input).await {
    Ok(resp)  => println!("Success: {resp}"),
    Err(e)    => eprintln!("Error: {e}"),
}
```

All errors implement `std::error::Error` via `thiserror`.

---

## 🧩 Example Response

```json
{ "status": "success", "request_id": "abc123" }
```

---

## 🛠 Development

```bash
cargo build
cargo test
cargo clippy
```