1use mqttrs::Packet;
2use std::convert::TryFrom;
3use std::string::FromUtf8Error;
4
5#[derive(Debug)]
6struct Publish {
7 dup: bool,
8 qospid: mqttrs::QosPid,
9 retain: bool,
10 topic_name: String,
11 payload: String
12}
13impl<'a> TryFrom<&'a mqttrs::Publish<'a>> for Publish {
14 type Error = FromUtf8Error;
15
16 fn try_from(publish: &'a mqttrs::Publish<'a>) -> Result<Self, FromUtf8Error> {
17 Ok(Self {
18 dup: publish.dup,
19 qospid: publish.qospid,
20 retain: publish.retain,
21 topic_name: publish.topic_name.to_owned(),
22 payload: String::from_utf8(publish.payload.into())?
23 })
24 }
25}
26
27pub fn format_packet(packet: Packet) -> String {
28 match packet {
29 Packet::Connect(packet) => format!("{:#?}", packet),
30 Packet::Connack(packet) => format!("{:#?}", packet),
31 Packet::Subscribe(packet) => format!("{:#?}", packet),
32 Packet::Unsubscribe(packet) => format!("{:#?}", packet),
33 Packet::Suback(packet) => format!("{:#?}", packet),
34 Packet::Publish(packet) => {
35 if let Ok(packet) = Publish::try_from(&packet) {
36 format!("{:#?}", packet)
37 } else {
38 format!("{:#?}", packet)
39 }
40 },
41 packet
42 @
43 (Packet::Puback(_)
44 | Packet::Pubrel(_)
45 | Packet::Pubrec(_)
46 | Packet::Pubcomp(_)
47 | Packet::Unsuback(_)) => format!("{:#?}", packet),
48 Packet::Disconnect => format!("{:#?}", Packet::Disconnect),
49 Packet::Pingreq => format!("{:#?}", Packet::Disconnect),
50 Packet::Pingresp => format!("{:#?}", Packet::Disconnect),
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57
58 #[test]
59 fn test_format_disconnect() {
60 assert_eq!("Disconnect", format_packet(Packet::Disconnect));
61 }
62}