taubyte_sdk/pubsub/node/
publish.rs

1use super::{imports, Channel};
2use crate::errno::Error;
3
4impl Channel {
5    fn publish_unsafe(&self, data: *const u8, size: usize) -> Error {
6        #[allow(unused_unsafe)]
7        unsafe {
8            imports::publishToChannel(self.name.as_ptr(), self.name.len(), data, size)
9        }
10    }
11
12    pub fn publish(&self, data: &[u8]) -> Result<(), Box<dyn std::error::Error>> {
13        let err0 = self.publish_unsafe(data.as_ptr(), data.len());
14        if err0.is_err() {
15            Err(format!(
16                "Publishing to channel: `{}` failed with: {}",
17                self.name, err0
18            )
19            .into())
20        } else {
21            Ok(())
22        }
23    }
24}
25
26#[cfg(test)]
27pub mod test {
28    use crate::pubsub::Channel;
29    pub static NAME: &str = "testChannel";
30    pub static DATA: &[u8] = b"testData";
31
32    #[test]
33    fn channel_publish() {
34        let channel = Channel::new(NAME.to_string()).unwrap();
35        channel.publish(DATA).unwrap();
36    }
37}
38
39#[cfg(test)]
40#[allow(non_snake_case)]
41pub mod mock {
42    use super::test;
43    use crate::{
44        errno::{Errno, Error},
45        utils::test as utils,
46    };
47
48    pub fn publishToChannel(
49        name_ptr: *const u8,
50        name_size: usize,
51        data_ptr: *const u8,
52        data_size: usize,
53    ) -> Error {
54        let name = utils::read_string(name_ptr, name_size);
55        let data = utils::read_bytes(data_ptr, data_size);
56
57        if name != test::NAME || data != test::DATA {
58            Errno::ErrorCap.error()
59        } else {
60            Errno::ErrorNone.error()
61        }
62    }
63}