# SmartChannel

**SmartChannel** is a Rust library built on top of Tokio that enhances the capabilities of the standard Tokio sender/receiver channels by providing additional features such as ID-based sender/receiver pairs.
 
---

## **Features**

- **ID-Linked Channels**: Each sender and receiver is associated with a unique connection ID, enabling verification of sender-receiver bindings.
- **Lightweight Wrappers**: Sender and receiver types wrap Tokio's standard channels, adding extra metadata while keeping the same behavior.
- **Interoperability**: SmartChannel supports direct dereferencing to use all standard Tokio sender/receiver methods.
- **Custom Bindings**: Provides bind and channel functions to associate custom IDs with channels.


---

## **Installation**

Add the following line to your Cargo.toml:
```toml
[dependencies]
smart_channel = "0.1.0"
```

## **Usage**

### Exemple 1: Basic Usage
```rust
use smart_channel::channel;

#[tokio::main]
async fn main() {
    let id = 1;
    let (sender, mut receiver) = channel::<String, _>(100, id);

    tokio::spawn(async move {
        sender.send("Hello from sender!".to_string()).await.unwrap();
    });

    let message = receiver.recv().await.unwrap();
    assert_eq!(message, "Hello from sender!");
}
```
### Example 2: Sender and Receiver ID Matching
```rust
use smart_channel::channel;

#[tokio::main]
async fn main() {
    let id = "channel-1".to_string();
    let (sender, receiver) = channel::<i32, _>(100, id.clone());

    assert!(sender.is_bound_to(&receiver));
    println!("Sender and receiver are bound by ID: {:?}", id.id);
}
```

## **Exemple 3: Multiple Channels with Differents IDs**

```rust
use smart_channel::channel;

#[tokio::main]
async fn main() {
    let id1 = "channel-1".to_string();
    let id2 = "channel-2".to_string();

    let (sender1, receiver1) = channel::<String, _>(100, id1.clone());
    let (sender2, receiver2) = channel::<String, _>(100, id2.clone());

    assert!(sender1.is_bound_to(&receiver1));
    assert!(!sender1.is_bound_to(&receiver2));  // Different IDs

    println!("Channel-1: bound correctly");
}
```

---

## **Contributing**

Contributions are welcome! If you encounter bugs, have feature requests, or want to submit a pull request, feel free to visit the GitHub repository.
Check the issues section for upcoming features, such as clonable receivers and broadcasting channels.

## **License**

This project is licensed under the MIT License. See the LICENSE file for details.