Crates.io | read_until_slice |
lib.rs | read_until_slice |
version | 0.1.7 |
source | src |
created_at | 2024-02-18 15:03:39.685306 |
updated_at | 2024-09-22 17:55:14.421543 |
description | AsyncBufRead::read_until extension to take a slice as a delimiter instead of a single u8. |
homepage | |
repository | https://github.com/programingjd/read_until_slice |
max_upload_size | |
id | 1144129 |
size | 26,850 |
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");
}