ollama/src/line_buffer.rs
32 lines
use bytes::BytesMut;use memchr::memchr;#[derive(Default)]#[cfg_attr(test, derive(Debug, PartialEq, Eq))]pub(crate) struct LineBuffer { bytes: BytesMut, /// Prefix already scanned and known not to contain a newline. scanned_len: usize,}impl LineBuffer { pub(crate) fn extend_from_slice(&mut self, bytes: &[u8]) { self.bytes.extend_from_slice(bytes); } pub(crate) fn take_line(&mut self) -> Option<BytesMut> { let Some(relative_index) = memchr(b'\n', &self.bytes[self.scanned_len..]) else { self.scanned_len = self.bytes.len(); return None; }; let newline_index = self.scanned_len + relative_index; let line = self.bytes.split_to(newline_index + 1); self.scanned_len = 0; Some(line) }}#[cfg(test)]#[path = "line_buffer_tests.rs"]mod tests;