Pigeon

What's this?

A crate for efficient packing and unpacking of big-endian binary data.

It's used in tinytown for its networking code.

Can I see an example?

```rust use { pigeon::{ Writer, Reader, Target, Unpack, Pack, WriteResult, ReadResult, ReadError, U3, U5, }, };

[derive(Debug, PartialEq)]

pub struct Animal { pub position: (u8, u8, u8), pub fluffy: bool, pub name: String, pub weight: f32, }

impl Pack for Animal { fn pack(&self, writer: &mut Writer) -> WriteResult<()> { writer.write((U3(self.position.0), U3(self.position.1), U3(self.position.2)))?; writer.write(self.fluffy)?; let namebytes = self.name.asbytes(); writer.write(U5(namebytes.len() as u8))?; writer.writebytes(name_bytes)?; writer.write(self.weight)?; Ok(()) } }

impl<'a> Unpack<'a> for Animal { fn unpack(reader: &mut Reader<'a>) -> ReadResult { let (U3(x), U3(y), U3(z)) = reader.read()?; let position = (x, y, z); let fluffy = reader.read()?; let U5(namelenu8) = reader.read()?; let namelen = namelenu8 as usize; let namebytesunaligned = reader.readbytes(namelen)?; let mut namebytes = [0; 256]; namebytesunaligned.copytoslice(&mut namebytes[0..namelen]); let name = String::fromutf8(namebytes[0..namelen].tovec()).maperr(|| ReadError::UnexpectedData)?; let weight = reader.read()?; Ok(Animal { position, fluffy, name: name.to_owned(), weight, }) } }

let kitty = Animal { position: (3, 2, 7), fluffy: true, name: "Joseph Joestar".to_owned(), weight: 12., };

let mut buf = [0; 128];

let mut writer = Writer::new(&mut buf[..]);

writer.write(&kitty).unwrap();

let len = writer.finish().unwrap();

let mut reader = Reader::new(&buf[..len]);

let kitty_: Animal = reader.read().unwrap();

asserteq!(kitty, kitty); ```

What license is it under?

AGPLv3 or later