taubyte_sdk/pubsub/node/
publish.rs1use 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}