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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use std::{fmt, io};
use crate::{client::Client, Headers};
#[derive(Clone)]
pub struct Message {
pub subject: String,
pub reply: Option<String>,
pub data: Vec<u8>,
pub headers: Option<Headers>,
#[doc(hidden)]
pub client: Client,
}
impl Message {
pub fn respond(&self, msg: impl AsRef<[u8]>) -> io::Result<()> {
match self.reply.as_ref() {
None => Err(io::Error::new(
io::ErrorKind::InvalidInput,
"no reply subject available",
)),
Some(reply) => self.client.publish(reply, None, None, msg.as_ref()),
}
}
}
impl fmt::Debug for Message {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
f.debug_struct("Message")
.field("subject", &self.subject)
.field("headers", &self.headers)
.field("reply", &self.reply)
.field("length", &self.data.len())
.finish()
}
}
impl fmt::Display for Message {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut body = format!("[{} bytes]", self.data.len());
if let Ok(str) = std::str::from_utf8(&self.data) {
body = str.to_string();
}
if let Some(reply) = &self.reply {
write!(
f,
"Message {{\n subject: \"{}\",\n reply: \"{}\",\n data: \
\"{}\"\n}}",
self.subject, reply, body
)
} else {
write!(
f,
"Message {{\n subject: \"{}\",\n data: \"{}\"\n}}",
self.subject, body
)
}
}
}