Add test and update interface

This commit is contained in:
Alex Mikhalev 2020-12-24 11:19:02 -07:00
parent c8384a95c5
commit 4623cea844
2 changed files with 60 additions and 10 deletions

View File

@ -7,3 +7,11 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
[dependencies.tokio]
version = "1"
features = ["sync"]
[dev-dependencies.tokio]
version = "1"
features = ["rt", "macros"]

View File

@ -4,6 +4,14 @@ pub trait Message: 'static + Clone + Send + Sync {}
impl<T> Message for T where T: 'static + Clone + Send + Sync {}
#[derive(Clone, Debug, PartialEq)]
#[non_exhaustive]
pub enum SubscribeError {}
#[derive(Clone, Debug, PartialEq)]
#[non_exhaustive]
pub enum AdvertiseError {}
pub struct Orsb {}
impl Orsb {
@ -11,18 +19,26 @@ impl Orsb {
todo!()
}
pub fn subscribe<T: Message>(&mut self) -> Subscription<T> {
pub async fn subscribe<T: Message>(&mut self) -> Result<Subscription<T>, SubscribeError> {
todo!()
}
pub fn advertise<T: Message>(&mut self) -> Publication<T> {
pub async fn advertise<T: Message>(&mut self) -> Result<Publication<T>, AdvertiseError> {
todo!()
}
pub fn subscribe_blocking<T: Message>(&mut self) -> Result<Subscription<T>, SubscribeError> {
todo!()
}
pub fn advertise_blocking<T: Message>(&mut self) -> Result<Publication<T>, AdvertiseError> {
todo!()
}
}
#[derive(Clone, Debug)]
#[derive(Clone, Debug, PartialEq)]
#[non_exhaustive]
pub enum RecvErr {
pub enum RecvError {
Empty,
Closed,
Lagged,
@ -33,22 +49,22 @@ pub struct Subscription<T> {
}
impl<T: Message> Subscription<T> {
pub async fn recv_wait(&mut self) -> Result<T, RecvErr> {
pub async fn recv(&mut self) -> Result<T, RecvError> {
todo!()
}
pub fn recv(&mut self) -> Result<T, RecvErr> {
pub fn recv_blocking(&mut self) -> Result<T, RecvError> {
todo!()
}
pub fn try_recv(&mut self) -> Result<T, RecvErr> {
pub fn try_recv(&mut self) -> Result<T, RecvError> {
todo!()
}
}
#[derive(Clone, Debug)]
#[derive(Clone, Debug, PartialEq)]
#[non_exhaustive]
pub enum SendErr {
pub enum SendError {
NoListeners,
}
@ -57,7 +73,33 @@ pub struct Publication<T> {
}
impl<T: Message> Publication<T> {
pub fn send(&mut self) -> Result<T, SendErr> {
pub fn send(&mut self, message: T) -> Result<(), SendError> {
let _ = message;
todo!()
}
}
#[cfg(test)]
mod test {
use super::*;
#[derive(Clone, Debug, PartialEq)]
struct TestMsg(u8);
#[test]
fn test_sync() {
let mut orsb = Orsb::new();
let mut sub = orsb.subscribe_blocking::<TestMsg>().unwrap();
let mut publ = orsb.advertise_blocking::<TestMsg>().unwrap();
publ.send(TestMsg(10)).unwrap();
publ.send(TestMsg(20)).unwrap();
publ.send(TestMsg(30)).unwrap();
assert_eq!(sub.recv_blocking(), Ok(TestMsg(10)));
assert_eq!(sub.recv_blocking(), Ok(TestMsg(20)));
assert_eq!(sub.recv_blocking(), Ok(TestMsg(30)));
assert_eq!(sub.try_recv(), Err(RecvError::Empty));
}
}