rumqttd 0.20.0

rumqttd is a high performance MQTT broker written in Rust which is light weight and embeddable
Documentation
use super::*;
use bytes::{Buf, Bytes};

pub fn read(fixed_header: FixedHeader, mut bytes: Bytes) -> Result<Unsubscribe, Error> {
    let variable_header_index = fixed_header.fixed_header_len;
    bytes.advance(variable_header_index);

    let pkid = read_u16(&mut bytes)?;
    let mut payload_bytes = fixed_header.remaining_len - 2;
    let mut filters = Vec::with_capacity(1);

    while payload_bytes > 0 {
        let topic_filter = read_mqtt_string(&mut bytes)?;
        payload_bytes -= topic_filter.len() + 2;
        filters.push(topic_filter);
    }

    let unsubscribe = Unsubscribe { pkid, filters };
    Ok(unsubscribe)
}

pub fn write(unsubscribe: &Unsubscribe, buffer: &mut BytesMut) -> Result<usize, Error> {
    let remaining_len = 2 + unsubscribe
        .filters
        .iter()
        .fold(0, |s, topic| s + topic.len() + 2);

    buffer.put_u8(0xA2);
    let remaining_len_bytes = write_remaining_length(buffer, remaining_len)?;
    buffer.put_u16(unsubscribe.pkid);

    for topic in unsubscribe.filters.iter() {
        write_mqtt_string(buffer, topic.as_str());
    }
    Ok(1 + remaining_len_bytes + remaining_len)
}