1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use std::rc::Rc;
use super::SOURCE_GUEST;
use crate::HostRuntimeInterface;
use crate::Result;
use wascap_codec as codec;
use codec::AsCommand;
use codec::messaging::{PublishMessage, BrokerMessage};
const TARGET_MESSAGING: &'static str = "wascap:messaging";
pub struct MessageBroker {
hri: Rc<&'static dyn HostRuntimeInterface>,
}
impl MessageBroker {
pub(crate) fn new(hri: Rc<&'static dyn HostRuntimeInterface>) -> MessageBroker {
MessageBroker {
hri,
}
}
pub fn publish(&self, subject: &str, reply_to: Option<&str>, payload: &[u8]) -> Result<()> {
let cmd = PublishMessage {
message: Some(BrokerMessage {
subject: subject.to_string(),
reply_to: reply_to.map_or("".to_string(), |r| r.to_string()),
body: payload.to_vec(),
})
}.as_command(SOURCE_GUEST, TARGET_MESSAGING);
self.hri.do_host_call(&cmd).map(|_evt| ())
}
}