1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
#![forbid(missing_docs)]
#![forbid(unsafe_code)]

//! A crate for reading/writing from/to byte buffers.
//!
//! This crate uses big-endian for all numbers.
//!
//! # Usage 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<T: Target>(&self, writer: &mut Writer<T>) -> WriteResult<()> {
//!         writer.write((U3(self.position.0), U3(self.position.1), U3(self.position.2)))?;
//!         writer.write(self.fluffy)?;
//!         let name_bytes = self.name.as_bytes();
//!         writer.write(U5(name_bytes.len() as u8))?;
//!         writer.write_bytes(name_bytes)?;
//!         writer.write(self.weight)?;
//!         Ok(())
//!     }
//! }
//!
//! impl<'a> Unpack<'a> for Animal {
//!     fn unpack(reader: &mut Reader<'a>) -> ReadResult<Self> {
//!         let (U3(x), U3(y), U3(z)) = reader.read()?;
//!         let position = (x, y, z);
//!         let fluffy = reader.read()?;
//!         let U5(name_len_u8) = reader.read()?;
//!         let name_len = name_len_u8 as usize;
//!         let name_bytes_unaligned = reader.read_bytes(name_len)?;
//!         let mut name_bytes = [0; 256];
//!         name_bytes_unaligned.copy_to_slice(&mut name_bytes[0..name_len]);
//!         let name = String::from_utf8(name_bytes[0..name_len].to_vec()).map_err(|_| 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();
//!
//! assert_eq!(kitty, kitty_);
//! ```

mod adapters;
mod impls;
mod pack;
mod unaligned_slice;
mod unpack;

pub use {
    adapters::{U1, U2, U3, U4, U5, U6, U7},
    pack::{pack_buffer, Error as WriteError, Pack, Result as WriteResult, Target, Writer},
    unaligned_slice::{Iter, UnalignedSlice},
    unpack::{unpack_buffer, Error as ReadError, Reader, Result as ReadResult, Unpack},
};