mqtt_visualizer/
lib.rs

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}