#buffer #byte-buffer #byte #type #no-alloc

no-std tbytes

A tiny library for reading and writing typed data into buffers

3 releases

0.1.0 Mar 25, 2024
0.1.0-alpha2 Dec 7, 2023

#590 in Data structures

Download history 36/week @ 2024-01-19 22/week @ 2024-01-26 5/week @ 2024-02-23 2/week @ 2024-03-01 9/week @ 2024-03-08 137/week @ 2024-03-15 240/week @ 2024-03-22 68/week @ 2024-03-29 54/week @ 2024-04-05 25/week @ 2024-04-12 22/week @ 2024-04-19 17/week @ 2024-04-26 7/week @ 2024-05-03

77 downloads per month
Used in 4 crates (2 directly)

MIT/Apache

45KB
315 lines

T-Bytes

logo

T-Bytes is a tiny library for reading and writing typed data into bytes buffers. It is designed mainly for no-std, no-alloc targets or crates which consider to support no-std.

Documentation can be found here.

Installation

cargo add tbytes

Usage

It would be easier to start from an example. Here we create a buffer and populate it with heterogeneous values.

use tbytes::errors::TBytesError;
use tbytes::{BytesWriterFor, TBytesReader, TBytesReaderFor, TBytesWriter};

fn main() -> Result<(), TBytesError> {
    type Content = (i16, f32, [u8; 2], [i16; 2]);
    let mut buffer = [0u8; 12];
    
    let mut writer = TBytesWriter::from(buffer.as_mut_slice());
    
    let into_values: Content = (-1048, 0.32, [10, 31], [-1, 240]);
    writer.write(into_values.0)?;
    writer.write(into_values.1)?;
    writer.write_slice(into_values.2.as_slice())?;
    writer.write_array(into_values.3)?;
    
    assert!(matches!(writer.write(0u8), Err(TBytesError::OutOfBounds)));
    
    let reader = TBytesReader::from(buffer.as_slice());
    
    let mut from_values: Content = Content::default();
    from_values.0 = reader.read()?;
    from_values.1 = reader.read()?;
    from_values.2 = reader.read_array()?;
    from_values.3 = reader.read_array()?;
    
    assert!(matches!(
          reader.read() as Result<u8, TBytesError>,
          Err(TBytesError::OutOfBounds)
      ));
    
    assert_eq!(into_values, from_values);
    
    Ok(())
}

See examples for advanced usage.

Examples

  • basic — basic read/write.
    cargo run --example basic
    

Limitations

We want to keep as simple as possible but simplicity comes with a price.

  • At the moment only little endian is supported.
  • We currently supports only numeric types and arrays of such types. But you can always implement your own TBytesReaderFor / TBytesWriterFor. Or even better, submit a pull request!

License

Here we simply comply with the suggested dual licensing according to Rust API Guidelines (C-PERMISSIVE).

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~180KB