Crate crosstalk

Crate crosstalk 

Source
Expand description

§crosstalk

LICENSE Crates.io Version

A lightweight wrapper of tokio’s bounded broadcasting channels to enable topic-based (publisher/subscriber) paradigm of mpmc communication.

#![allow(dead_code)]

use std::thread;
use std::collections::HashMap;
use crosstalk::AsTopic;

#[derive(AsTopic)] // required for crosstalk topic
enum TopicZoo {
    Topic1,
    Topic2,
    Topic3,
    Topic4,
    Topic5,
    Topic6,
}

#[derive(Clone)] // required for crosstalk data
#[derive(PartialEq, Debug)]
struct Vehicle {
    make: String,
    model: String,
    color: Color,
    wheels: u8,
}

#[derive(Clone)] // required for crosstalk data
#[derive(PartialEq, Debug)]
enum Color {
    Red,
    Blue,
    Green
}

crosstalk::init! {
    TopicZoo::Topic1 => Vec<u32>,
    TopicZoo::Topic2 => String,
    TopicZoo::Topic3 => Vehicle,
    TopicZoo::Topic4 => HashMap<&str, Vec<Vehicle>>,
    TopicZoo::Topic5 => Color,
}
// TopicZoo::Topic6 not included: defaults to String

#[tokio::main]
async fn main() {
    let mut node = crosstalk::BoundedNode::<TopicZoo>::new(1024);

    let (pub0_topic5, mut sub0_topic5) = node
        .pubsub(TopicZoo::Topic5)
        .await
        .unwrap();
    let mut sub1_topic5 = node
        .subscriber(TopicZoo::Topic5)
        .await
        .unwrap();

    let message = Color::Red;

    thread::spawn(move || { pub0_topic5.write(message); });

    let received_0 = sub0_topic5.read().await;
    let received_1 = sub1_topic5.read().await;

    println!("{:?}", received_0);
    println!("{:?}", received_1);
    assert_eq!(received_0, received_1);
}

§Why crosstalk?

Most mpmc libraries focuses on a single FIFO channel, rather than broadcasting. Tokio is one of the only established mpmc / async libraries that supports broadcasting, so the motivation was to wrap tokio’s channels with a topic-based paradigm, similar to ROS, for ease of use. Crosstalk acts as a lightweight wrapper of tokio::sync::broadcast, correlating topic enums with datatypes and senders/receivers. Crosstalk can be used to dynamically create and destroy publishers and subscribers at runtime, across multiple threads.

§License

Crosstalk is released under the MIT license http://opensource.org/licenses/MIT

Modules§

__macro_exports

Macros§

init
Macro used to initialize a crosstalk node

Structs§

BoundedNode
A BoundedNode is a node to spawn publishers and subscribers on, where the size of each buffer is fixed.
ImplementedBoundedNode
The inner implementation of the node, which implements the AsTopic trait
Publisher
A crosstalk Publisher
Subscriber
A crosstalk Subscriber

Enums§

Error
crosstalk errors

Traits§

CrosstalkData
A trait to bound a datatype as a CrosstalkData
CrosstalkPubSub
A trait to define a CrosstalkPubSub
CrosstalkTopic
A trait bound an enum as a CrosstalkTopic

Derive Macros§

AsTopic
The AsTopic derive macro