unisub 0.1.2

A Pub/Sub library for Rust backed by Postgres
Documentation
# Unisub

[![Crates.io](https://img.shields.io/crates/v/unisub.svg)](https://crates.io/crates/unisub) [![Docs.rs](https://docs.rs/unisub/badge.svg)](https://docs.rs/unisub)

Unisub is a Pub/Sub library for Rust, using Postgres as the backend. It offers a convenient way to publish and subscribe to messages across different topics.

## Features

- Publish messages to topics
- Subscribe to topics to receive messages
- Create and remove topics
- Includes a convenience binary for managing topics and running migrations
- Asynchronous design using Tokio

## Installation

Add Unisub as a dependency in your `Cargo.toml`:

```toml
[dependencies]
unisub = "*"
```

## Setting up the Postgres Environment

1. Install Postgres if you haven't already. You can download it from [here]https://www.postgresql.org/download/.
2. Create a new database and note the connection URL.
3. Make sure your Postgres database is accessible and running.

### Environment Variable

Set an environment variable called `DATABASE_URL` with the Postgres connection URL.

```bash
export DATABASE_URL=postgres://username:password@localhost/dbname
```

### Running Migrations and Setting Up Topics

#### Using CLI

First, run the migrations:

```bash
unisub migrate
```

Then you can add your topics:

```bash
unisub add-topic my_topic
```

#### Programmatically

```rust
use unisub::PubSub;
use unisub::migrate;
use sqlx::PgPool;

#[tokio::main]
async fn main() -> Result<(), unisub::Error> {
    let pool = PgPool::connect("your_database_url").await?;
    migrate(&pool).await?;
    let mut pubsub = PubSub::new(pool).await?;
    pubsub.add_topic("my_topic").await?;
    Ok(())
}
```

## Usage

### Library

```rust
use unisub::PubSub;
use sqlx::PgPool;

#[tokio::main]
async fn main() -> Result<(), unisub::Error> {
    let pool = PgPool::connect("your_database_url").await?;
    let mut pubsub = PubSub::new(pool).await?;
    pubsub.push("my_topic", b"My message").await?;
    Ok(())
}
```

And here's an example of how to subscribe to a topic:

```rust
use unisub::PubSub;
use sqlx::PgPool;

#[tokio::main]
async fn main() -> Result<(), unisub::Error> {
    // Connect to the database
    let pool = PgPool::connect("your_database_url").await?;
    let mut pubsub = PubSub::new(pool).await?;

    // Subscribe to the topic
    pubsub.subscribe("my_topic", |message| {
        async {
            // Print the received message
            println!("Received message: {:?}", message);

            // Simulate some asynchronous work with the received message
            tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
            println!("Finished processing message: {:?}", message);

            Ok(())
        }
    }).await?;

    Ok(())
}
```

## Contributing

Contributions are welcome! Please submit a pull request or create an issue to get started.

## License

This project is licensed under the MIT License.