pigeon 0.1.0

Utilities for efficient packing and unpacking of big-endian binary data
Documentation
use crate::{
    dump::{Dump, FrameTarget, FrameWriter},
    grab::{FrameReader, Grab},
};

/// A UTF-8 string that is prefixed with its length, where the length field is a `u8`.
///
/// ```rust
/// # use {
/// #     pigeon::{
/// #         FrameWriter,
/// #         FrameReader,
/// #         ShortStr,
/// #     },
/// # };
/// let mut bytes = [0; 67];
///
/// let mut writer = FrameWriter::new(&mut bytes[..]);
/// writer.write(ShortStr("Couscous à tout le monde!"));
/// writer.write(ShortStr("Ik ben een patatje."));
/// writer.write(ShortStr("I like to eat cake."));
///
/// let mut reader = FrameReader::new(&bytes[..]);
/// let ShortStr(a) = reader.read().unwrap();
/// assert_eq!(a, "Couscous à tout le monde!");
/// let ShortStr(b) = reader.read().unwrap();
/// assert_eq!(b, "Ik ben een patatje.");
/// let ShortStr(c) = reader.read().unwrap();
/// assert_eq!(c, "I like to eat cake.");
/// ```
pub struct ShortStr<'a>(pub &'a str);

impl<'a> Dump for ShortStr<'a> {
    fn dump_to<T: FrameTarget>(&self, writer: &mut FrameWriter<T>) {
        let bytes = self.0.as_bytes();
        writer.write(bytes.len() as u8);
        writer.write_bytes(bytes);
    }
}

impl<'a> Grab<'a> for ShortStr<'a> {
    fn grab_from(reader: &mut FrameReader<'a>) -> Option<ShortStr<'a>> {
        let len = reader.read::<u8>()? as usize;
        let bytes = reader.read_bytes(len)?;
        let text = std::str::from_utf8(bytes).ok()?;
        Some(ShortStr(text))
    }
}