rustwire 0.2.0

A Rust library for efficient manipulation of encoded protocol buffer messages.
Documentation
pub(crate) fn decode_varint(bytes: &[u8], offset: usize) -> Option<(u64, usize)> {
    let mut result = 0u64;
    let mut shift = 0;
    for (i, byte) in bytes.iter().enumerate().skip(offset) {
        result |= ((byte & 0x7F) as u64) << shift;
        if byte & 0x80 == 0 {
            return Some((result, i + 1));
        }
        shift += 7;
        if shift >= 64 {
            return None;
        }
    }
    None
}

pub(crate) fn decode_float(encoded_message: &[u8], offset: usize) -> Option<usize> {
    if offset + 4 <= encoded_message.len() {
        Some(offset + 4)
    } else {
        None
    }
}

pub(crate) fn decode_double(encoded_message: &[u8], offset: usize) -> Option<usize> {
    if offset + 8 <= encoded_message.len() {
        Some(offset + 8)
    } else {
        None
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_decode_varint() {
        let bytes = [0x96, 0x01];
        let (result, new_offset) = decode_varint(&bytes, 0).unwrap();
        assert_eq!(result, 150);
        assert_eq!(new_offset, 2);
    }

    #[test]
    fn test_decode_float() {
        let bytes = [0x00, 0x00, 0x48, 0x40];
        let new_offset = decode_float(&bytes, 0).unwrap();
        assert_eq!(new_offset, 4);
    }

    #[test]
    fn test_decode_double() {
        let bytes = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x40];
        let new_offset = decode_double(&bytes, 0).unwrap();
        assert_eq!(new_offset, 8);
    }
}