fixed-buffer
This is a Rust library with fixed-size buffers, useful for network protocol parsers and file parsers.
Features
forbid(unsafe_code)- Depends only on
std - Write bytes to the buffer and read them back
- Lives on the stack
- Does not allocate
- Use it to read a stream, search for a delimiter, and save leftover bytes for the next read.
- No macros
- Good test coverage (100%)
- Async support by enabling cargo features
async-std-feature,futures-io,smol-feature, ortokio.
Limitations
- Not a circular buffer.
You can call
shift()periodically to move unread bytes to the front of the buffer.
Examples
Read and handle requests from a remote client:
use ;
use Error;
use TcpStream;
For a complete example, see
tests/server.rs.
Read and process records:
use FixedBuf;
use ;
use TcpStream;
The From<&[u8; SIZE]> implementation is useful in tests. Example:
use From;
assert_eq!;
Cargo Geiger Safety Report
Metric output format: x/y
x = unsafe code used by the build
y = total unsafe code found in the crate
Symbols:
🔒 = No `unsafe` usage found, declares #![forbid(unsafe_code)]
❓ = No `unsafe` usage found, missing #![forbid(unsafe_code)]
☢️ = `unsafe` usage found
Functions Expressions Impls Traits Methods Dependency
0/0 0/0 0/0 0/0 0/0 🔒 fixed-buffer 1.0.2
0/0 0/0 0/0 0/0 0/0
Alternatives
bytes, lots ofunsafebuf_redux, circular buffer support, updated in 2019std::io::BufReaderstd::io::BufWriterstatic-buffer, updated in 2016block-buffer, for processing fixed-length blocks of data, someunsafearrayvec, vector with fixed capacity, someunsafe
Changelog
- v1.0.2 2025-06-29 - Add
read_frame_tokio. - v1.0.1 2025-05-30 - Clarify docs.
- v1.0.0 2024-10-20 -
From<&[u8; SIZE]>,FixedBuffer::from(b"x") - v0.5.0 2022-03-21 - Move
ReadWriteChainandReadWriteTaketo newread-write-extcrate. - v0.4.0 2022-03-21
From<[u8; SIZE]>,FixedBuffer::from([0])write_bytesto takeAsRef<[u8]>- Rename
try_read_exacttoread_and_copy_exact. - Rename
try_read_bytestotry_read_exact. - Remove
empty,filled,read_byte,read_bytes,try_parse, andwrite_str. deframeto allow consuming bytes without returning a framewrite_bytesto write as many bytes as it can, and return newNoWritableSpaceerror only when it cannot write any bytes. RemoveNotEnoughSpaceError. The method now behaves likestd::io::Write::write.
- v0.3.1 - Implement
From<NotEnoughSpaceError>andFrom<MalformedInputError>forString. - v0.3.0 - Breaking API changes:
- Change type parameter to const buffer size. Example:
FixedBuf<1024>. - Remove
newarg. - Remove
capacity. - Remove
Copyimpl. - Change
writablereturn type to&mut [u8].
- Change type parameter to const buffer size. Example:
- v0.2.3
- Add
read_byte,try_read_byte,try_read_bytes,try_read_exact,try_parse. - Implement
UnwindSafe
- Add
- v0.2.2 - Add badges to readme
- v0.2.1 - Add
deframeandmem, needed byAsyncFixedBuf::read_frame. - v0.2.0
- Move tokio support to
fixed_buffer_tokio. - Add
copy_once_from,read_block,ReadWriteChain, andReadWriteTake.
- Move tokio support to
- v0.1.7 - Add
FixedBuf::escape_ascii. - v0.1.6 - Add
filledconstructor. - v0.1.5 - Change
read_delimitedto returnOption<&[u8]>, for clean EOF handling. - v0.1.4 - Add
clear(). - v0.1.3
- Thanks to freax13 for these changes:
- Support any buffer size. Now you can make
FixedBuf<[u8; 42]>. - Support any
AsRef<[u8]> + AsMut<[u8]>value for internal memory:[u8; N]Box<[u8; N]>&mut [u8]Vec<u8>
- Support any buffer size. Now you can make
- Renamed
new_with_memtonew. UseFixedBuf::default()to construct anyFixedBuf<T: Default>, which includes arrays of sizes up to 32.
- Thanks to freax13 for these changes:
- v0.1.2 - Updated documentation.
- v0.1.1 - First published version
TO DO
- Change links in docs to standard style. Don't link to
docs.rs. - Idea:
buf.slice(buf.read_frame(&mut reader, deframe_crlf)) - Add an
frame_copy_iterfunction. Because of borrowing rules, this function must return non-borrowed (allocated and copied) data. - Set up CI on:
- DONE - Linux x86 64-bit
- macOS
- Windows
- https://crate-ci.github.io/pr/testing.html#travisci
- Linux ARM 64-bit (Raspberry Pi 3 and newer)
- Linux ARM 32-bit (Raspberry Pi 2)
- RISCV & ESP32 firmware?
- DONE - Try to make this crate comply with the Rust API Guidelines.
- DONE - Find out how to include Readme.md info in the crate's docs.
- DONE - Make the repo public
- DONE - Set up continuous integration tests and banner.
- DONE - Add some documentation tests
- DONE - Set up public repository on Gitlab.com
- DONE - Publish to crates.io
- DONE - Read through https://crate-ci.github.io/index.html
- DONE - Get a code review from an experienced rustacean
- DONE - Add and update a changelog
- Update it manually
- https://crate-ci.github.io/release/changelog.html
Release Process
- Edit
Cargo.tomland bump version number. - Run
../release.sh
License: Apache-2.0