mirror of https://github.com/helix-editor/helix
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
889 B
Rust
38 lines
889 B
Rust
use std::io;
|
|
|
|
use ropey::iter::Chunks;
|
|
use ropey::RopeSlice;
|
|
|
|
pub struct RopeReader<'a> {
|
|
current_chunk: &'a [u8],
|
|
chunks: Chunks<'a>,
|
|
}
|
|
|
|
impl<'a> RopeReader<'a> {
|
|
pub fn new(rope: RopeSlice<'a>) -> RopeReader<'a> {
|
|
RopeReader {
|
|
current_chunk: &[],
|
|
chunks: rope.chunks(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl io::Read for RopeReader<'_> {
|
|
fn read(&mut self, mut buf: &mut [u8]) -> io::Result<usize> {
|
|
let buf_len = buf.len();
|
|
loop {
|
|
let read_bytes = self.current_chunk.read(buf)?;
|
|
buf = &mut buf[read_bytes..];
|
|
if buf.is_empty() {
|
|
return Ok(buf_len);
|
|
}
|
|
|
|
if let Some(next_chunk) = self.chunks.next() {
|
|
self.current_chunk = next_chunk.as_bytes();
|
|
} else {
|
|
return Ok(buf_len - buf.len());
|
|
}
|
|
}
|
|
}
|
|
}
|