#tokio #delimiter #async-buf-read #slice #bufread #read-until

read_until_slice

AsyncBufRead::read_until extension to take a slice as a delimiter instead of a single u8

13 releases

Uses new Rust 2024

new 0.1.12 Jul 5, 2025
0.1.10 Apr 23, 2025
0.1.9 Feb 16, 2025
0.1.8 Dec 20, 2024
0.1.2 Feb 18, 2024

#421 in Asynchronous

Download history 1/week @ 2025-03-22 1/week @ 2025-03-29 6/week @ 2025-04-05 1/week @ 2025-04-12 124/week @ 2025-04-19 33/week @ 2025-04-26 12/week @ 2025-05-03 36/week @ 2025-05-10 10/week @ 2025-05-17 133/week @ 2025-05-31 7/week @ 2025-06-07 7/week @ 2025-06-14 6/week @ 2025-06-21 8/week @ 2025-06-28 140/week @ 2025-07-05

161 downloads per month
Used in 3 crates (2 directly)

MIT license

9KB
103 lines

read_until_slice  LICENSE crates.io Version Documentation

The tokio io-util feature provides the method:

pub async fn read_until(&mut self, delimiter: u8, buf: Vec<u8>) -> Result<usize>

on impl AsyncBufRead + Unpin.

This reads from an async buffered reader until either EOF or the delimiter is reached.

While useful, it is limited to a single byte delimiter.

This crate extends this by taking a slice as a delimiter instead of a single byte.

pub async fn read_until_slice(&mut self, delimiter: &[u8], buf: Vec<u8>) -> Result<usize>

on the same impl AsyncBufRead + Unpin.

Example

// Open socket
let stream = TcpStream::connect(addr)
    .await
    .expect("could not connect to remote address");
// Split stream into reader and writer halves
let (reader, mut writer) = split(stream);
// Buffer read stream
let mut reader = BufReader::new(reader);
...
// Read until new line delimiter into buffer
let mut buffer = vec![];
let delimiter = b"\r\n";
let n = reader.read_until(delimiter, &mut buffer)
    .await
    .expect("could not read from socket");
assert_eq!(n, buffer.len());
if buffer.ends_with(delimiter) {
    println!("end of line delimiter reached");
} else {
    println!("end of stream reached");
}

Dependencies

~2–9.5MB
~85K SLoC