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