3 releases (stable)

1.1.0 Jul 13, 2024
1.0.0 Jul 13, 2024

#273 in Concurrency

Download history 254/week @ 2024-07-08 62/week @ 2024-07-15 78/week @ 2024-07-22 97/week @ 2024-07-29 33/week @ 2024-08-05 24/week @ 2024-08-12 66/week @ 2024-08-19 68/week @ 2024-08-26 44/week @ 2024-09-16 81/week @ 2024-09-23 34/week @ 2024-09-30 111/week @ 2024-10-07 42/week @ 2024-10-14

268 downloads per month
Used in chorus

MPL-2.0 license

14KB
121 lines

pubserve

Publish and observe.

Simple, generic observer pattern implementation for Rust.

Usage

pubserve is really simple to use. Start by creating a Publisher for your data type:

use pubserve::Publisher;

let publisher = Publisher::<i32>::new();

Then, create a subscriber that will listen to the publisher:

use pubserve::Subscriber;

struct MySubscriber;

impl Subscriber<i32> for MySubscriber {
    fn update(&self, message: &i32) {
        // Do whatever you want with the data!
        println!("Received data: {}", message);
    }
}

Finally, subscribe the observer to the publisher:

use pubserve::ReferenceCounted;

let observer = MySubscriber;
let reference = ReferenceCounted::new(&observer);
publisher.subscribe(reference);

Now, whenever you publish data, all subscribed observers will be notified:

publisher.publish(42);
// STDOUT: "Received data: 42"

Unsubscribing is just as easy:

publisher.unsubscribe(reference);
publisher.publish(42);
// Nothing will be printed

It is of course possible to have multiple implementations of Subscriber be subscribed to the same Publisher. All of them will be notified immediately when data is published.

Features

No features are enabled by default. The following features are available:

Feature Description
send Makes the Subscriber trait Send and thus thread-safe.
async Makes the Subscriber trait Sync and async via the async_trait crate. Additionally, makes the publishing method async by extension

The send and async features can both be enabled at the same time, but do not have to be, should you only need one of them.

License

This project is licensed under the MPL-2.0 license. See the LICENSE file for more information. By committing to this repository, you agree to license your contributions under the MPL-2.0 license.

Dependencies

~105KB