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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
use crate::*; /// Base enum for all MQTT packet types. /// /// This is the main type you'll be interacting with, as an output of [`decode()`] and an input of /// [`encode()`]. Most variants can be constructed directly without using methods. /// /// ``` /// # use mqttrs::*; /// # use core::convert::TryFrom; /// // Simplest form /// let pkt = Packet::Connack(Connack { session_present: false, /// code: ConnectReturnCode::Accepted }); /// // Using `Into` trait /// let publish = Publish { dup: false, /// qospid: QosPid::AtMostOnce, /// retain: false, /// topic_name: "to/pic".into(), /// payload: "payload".into() }; /// let pkt: Packet = publish.into(); /// // Identifyer-only packets /// let pkt = Packet::Puback(Pid::try_from(42).unwrap()); /// ``` /// /// [`encode()`]: fn.encode.html /// [`decode()`]: fn.decode.html #[derive(Debug, Clone, PartialEq)] pub enum Packet { /// [MQTT 3.1](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718028) Connect(Connect), /// [MQTT 3.2](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718033) Connack(Connack), /// [MQTT 3.3](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718037) Publish(Publish), /// [MQTT 3.4](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718043) Puback(Pid), /// [MQTT 3.5](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718048) Pubrec(Pid), /// [MQTT 3.6](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718053) Pubrel(Pid), /// [MQTT 3.7](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718058) Pubcomp(Pid), /// [MQTT 3.8](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718063) Subscribe(Subscribe), /// [MQTT 3.9](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718068) Suback(Suback), /// [MQTT 3.10](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718072) Unsubscribe(Unsubscribe), /// [MQTT 3.11](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718077) Unsuback(Pid), /// [MQTT 3.12](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718081) Pingreq, /// [MQTT 3.13](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718086) Pingresp, /// [MQTT 3.14](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718090) Disconnect, } impl Packet { /// Return the packet type variant. /// /// This can be used for matching, categorising, debuging, etc. Most users will match directly /// on `Packet` instead. pub fn get_type(&self) -> PacketType { match self { Packet::Connect(_) => PacketType::Connect, Packet::Connack(_) => PacketType::Connack, Packet::Publish(_) => PacketType::Publish, Packet::Puback(_) => PacketType::Puback, Packet::Pubrec(_) => PacketType::Pubrec, Packet::Pubrel(_) => PacketType::Pubrel, Packet::Pubcomp(_) => PacketType::Pubcomp, Packet::Subscribe(_) => PacketType::Subscribe, Packet::Suback(_) => PacketType::Suback, Packet::Unsubscribe(_) => PacketType::Unsubscribe, Packet::Unsuback(_) => PacketType::Unsuback, Packet::Pingreq => PacketType::Pingreq, Packet::Pingresp => PacketType::Pingresp, Packet::Disconnect => PacketType::Disconnect, } } } macro_rules! packet_from { ($($t:ident),+) => { $( impl From<$t> for Packet { fn from(p: $t) -> Self { Packet::$t(p) } } )+ } } packet_from!(Connect, Connack, Publish, Subscribe, Suback, Unsubscribe); /// Packet type variant, without the associated data. #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum PacketType { Connect, Connack, Publish, Puback, Pubrec, Pubrel, Pubcomp, Subscribe, Suback, Unsubscribe, Unsuback, Pingreq, Pingresp, Disconnect, }