# smskit β Universal MultiβProvider SMS Toolkit for Rust π
**Status:** v0.2.0 (beta) β Complete framework-agnostic SMS abstraction with support for every major Rust web framework.
## π― Why smskit?
Give your users the freedom to bring their own SMS provider while you code to a single, unified interface. Switch between Plivo, Twilio, AWS SNS, or any provider without changing your application code.
**π₯ NEW in v0.2.0:** Universal web framework support! Works with Axum, Warp, Actix-web, Rocket, Tide, Hyper, or ANY framework you can imagine.
## π¦ Architecture
```
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββββββ
β Your App β β sms-core β β SMS Providers β
β ββββββ (traits & types)ββββββ β’ Plivo β
β β’ Business Logicβ β β β β’ Twilio (soon) β
β β’ Web Routes β ββββββββββββββββββββ β β’ AWS SNS (soon) β
βββββββββββββββββββ β βββββββββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββββ ββββββββββββββββββββ
β Web Framework β β sms-web-generic β
β Adapters ββββββ (core logic) β
β β’ Axum β β β
β β’ Warp β β Framework- β
β β’ Actix-web β β agnostic β
β β’ Rocket β β processing β
β β’ Tide β β β
β β’ Hyper β β β
β β’ + ANY other β β β
βββββββββββββββββββ ββββββββββββββββββββ
```
## π Quick Start
### Option 1: Use Your Favorite Framework
<details>
<summary><strong>Axum</strong> (Click to expand)</summary>
```toml
[dependencies]
sms-core = "0.2"
sms-plivo = "0.2"
sms-web-axum = "0.2"
axum = "0.7"
tokio = { version = "1.0", features = ["full"] }
```
```rust
use std::sync::Arc;
use axum::{routing::post, Router};
use sms_core::InboundRegistry;
use sms_plivo::PlivoClient;
use sms_web_axum::{unified_webhook, AppState};
#[tokio::main]
async fn main() {
let plivo = PlivoClient::new("your_auth_id", "your_auth_token");
let registry = InboundRegistry::new().with(Arc::new(plivo));
let state = AppState { registry };
let app = Router::new()
.route("/webhooks/:provider", post(unified_webhook))
.with_state(state);
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
```
</details>
### Option 2: Framework-Agnostic Integration π₯
**Works with ANY web framework** - just adapt the request/response types:
```rust
use sms_web_generic::WebhookProcessor;
// This works with ANY web framework!
async fn handle_sms_webhook(provider: String, headers: Vec<(String, String)>, body: &[u8]) -> YourFrameworkResponse {
let processor = WebhookProcessor::new(your_registry);
let response = processor.process_webhook(&provider, headers, body);
// Convert to your framework's response type
response.into()
}
```
## π Supported Frameworks
| **Axum** | `sms-web-axum` | β
Complete | [Example](examples/unified_webhook.rs) |
| **Warp** | `sms-web-warp` | β
Complete | [Example](examples/frameworks/warp_server.rs) |
| **Actix-web** | `sms-web-actix` | β
Complete | [Example](examples/frameworks/actix_server.rs) |
| **Rocket** | `sms-web-rocket` | β
Complete | [Example](examples/frameworks/rocket_server.rs) |
| **Tide** | `sms-web-tide` | β
Complete | [Example](examples/frameworks/tide_server.rs) |
| **Hyper** | `sms-web-hyper` | β
Complete | [Example](examples/frameworks/hyper_server.rs) |
| **Generic** | `sms-web-generic` | β
Complete | [DIY Integration](examples/frameworks/generic_integration.rs) |
| **Your Framework** | DIY | β
Supported | Use `sms-web-generic`! |
## π SMS Providers
| **Plivo** | `sms-plivo` | β
| β
| Complete |
| **Twilio** | `sms-twilio` | π | π | Coming Soon |
| **AWS SNS** | `sms-aws-sns` | π | π | Coming Soon |
## π‘ Usage Examples
### Sending SMS
```rust
use sms_core::{SendRequest, SmsClient};
use sms_plivo::PlivoClient;
let client = PlivoClient::new("auth_id", "auth_token");
let response = client.send(SendRequest {
to: "+1234567890",
from: "+0987654321",
text: "Hello from smskit!"
}).await?;
println!("Message sent with ID: {}", response.id);
```
### Receiving SMS (Webhooks)
All frameworks receive the same normalized `InboundMessage`:
```rust
{
"id": "abc-123",
"from": "+1234567890",
"to": "+0987654321",
"text": "Hello World",
"timestamp": "2024-12-30T12:34:56Z",
"provider": "plivo",
"raw": { /* original provider payload */ }
}
```
**Webhook URLs:**
- POST `http://yourserver.com/webhooks/plivo`
- POST `http://yourserver.com/webhooks/twilio`
- POST `http://yourserver.com/webhooks/{any_provider}`
## πββοΈ Running Examples
```bash
# Test the generic integration (works everywhere!)
cargo run --example generic_integration
# Try with specific frameworks
cargo run --example warp_server --features warp
cargo run --example actix_server --features actix-web
cargo run --example hyper_server --features hyper
# Original Axum example
cargo run --example unified_webhook
```