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
//! `mqttrs` is a codec for the MQTT protocol.
//!
//! The API aims to be straightforward and composable, usable with plain `std` or with a framework
//! like [tokio]. The decoded packet is help in a [Packet] struct, and the encoded bytes in a
//! [bytes::BytesMut] struct. Convert between the two using [encode()] and [decode()]. Almost all
//! struct fields can be accessed directly, to create or read packets.
//!
//! It currently targets [MQTT 3.1], with [MQTT 5] support planned.
//!
//! ```
//! use mqttrs::*;
//! use bytes::BytesMut;
//!
//! // Allocate buffer.
//! let mut buf = [0u8; 1024];
//!
//! // Encode an MQTT Connect packet.
//! let pkt = Packet::Connect(Connect { protocol: Protocol::MQTT311,
//!                                     keep_alive: 30,
//!                                     client_id: "doc_client",
//!                                     clean_session: true,
//!                                     last_will: None,
//!                                     username: None,
//!                                     password: None });
//! let len = encode_slice(&pkt, &mut buf).unwrap();
//! assert_eq!(&buf[14..len], b"doc_client");
//! let mut encoded = buf.clone();
//!
//! // Decode one packet. The buffer will advance to the next packet.
//! assert_eq!(Ok(Some(pkt)), decode_slice(&mut buf));
//!
//! // Example decode failures.
//! let mut incomplete = encoded.split_at(10).0;
//! assert_eq!(Ok(None), decode_slice(&mut incomplete));
//! let mut garbage = BytesMut::from(&[0u8,0,0,0] as &[u8]);
//! assert_eq!(Err(Error::InvalidHeader), decode_slice(&mut garbage));
//! ```
//!
//! [MQTT 3.1]: http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html
//! [MQTT 5]: https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html
//! [tokio]: https://tokio.rs/
//! [Packet]: enum.Packet.html
//! [encode_slice()]: fn.encode_slice.html
//! [decode_slice()]: fn.decode_slice.html
//! [bytes::BytesMut]: https://docs.rs/bytes/0.5.3/bytes/struct.BytesMut.html

#![cfg_attr(not(test), no_std)]

#[cfg(feature = "std")]
extern crate std;

mod connect;
mod decoder;
mod encoder;
mod packet;
mod publish;
mod subscribe;
mod utils;

// Proptest does not currently support borrowed data in strategies:
// https://github.com/AltSysrq/proptest/issues/9
//
// #[cfg(test)]
// mod codec_test;
#[cfg(test)]
mod decoder_test;
#[cfg(test)]
mod encoder_test;

pub use crate::{
    connect::{Connack, Connect, ConnectReturnCode, LastWill, Protocol},
    decoder::{clone_packet, decode_slice},
    encoder::encode_slice,
    packet::{Packet, PacketType},
    publish::Publish,
    subscribe::{Suback, Subscribe, SubscribeReturnCodes, SubscribeTopic, Unsubscribe},
    utils::{Error, Pid, QoS, QosPid},
};