Skip to main content

Stream

Struct Stream 

Source
pub struct Stream<'index, Reader> { /* private fields */ }
Expand description

A stream which can be used to convert between offsets and line-column locations.

Index is a mutable reference to ensure that we can still refer to the index after consuming the whole Stream.

Implementations§

Source§

impl<'index, R> Stream<'index, R>

Source

pub fn new(reader: R, index: &'index mut Index) -> Self

Source

pub fn get_ref(&self) -> &R

Source

pub fn base(&self) -> usize

Source

pub fn query(&self) -> Query<'_>

Immutable query to further query offsets and line-column locations

Source

pub fn get_index(&self) -> &Index

Source§

impl<'index, R: Read> Stream<'index, R>

Source

pub fn read_len(&self) -> usize

Read length

Source

pub fn locate(&mut self, offset: Offset, buf: &mut [u8]) -> Result<ZeroBased>

Locate the (line, column) position for a given byte offset.

NOTE: this method may cause extra reading when the offset input cannot find a location.

This method first resolves the line index via [locate_line], then computes the column by subtracting the starting offset of that line.

§Parameters
  • offset: The target byte offset.
  • buf: A temporary buffer used for incremental reading.
§Returns
  • Ok(ZeroBased(line, column)) if the offset is within bounds.
  • Err if the offset exceeds EOF (propagated from [locate_line]).
§Invariants
  • The internal index always contains a valid starting offset for every line.
  • Therefore, line_offset(line) must succeed for any valid line.
§Notes
  • Both line and column are zero-based.
  • Column is computed in bytes, not characters (UTF-8 aware handling is not performed here).
Source

pub fn locate_line(&mut self, offset: Offset, buf: &mut [u8]) -> Result<usize>

Locate the line index for a given byte offset.

This method performs an incremental lookup: it first queries the existing line index, and if the offset is not covered, it reads more data and extends the index. This method may cause extra reading when the offset input cannot find a location.

§Invariants
  • The internal index is non-empty and ends with a sentinel EOF offset.
§Errors

Returns an error if offset exceeds EOF.

Source

pub fn encode( &mut self, line_index: ZeroBased, buf: &mut [u8], ) -> Result<Offset>

Encode a (line, column) location into a byte Offset.

This method may incrementally extend the internal line index by reading additional data if the requested line is not yet available.

§Behavior
  • If the line is already indexed, the offset is computed directly.
  • Otherwise, more data is read and the index is extended until the line becomes available or EOF is reached.
§Returns
  • Ok(offset) if the position can be resolved.
  • Err if the line index exceeds EOF.
§Notes
  • Column is interpreted as a byte offset relative to the start of the line.
  • This method does not validate whether the column lies within the bounds of the line.
Source

pub fn drain(&mut self, buf: &mut [u8]) -> Result<()>

Drain the reader, consume the reader

Trait Implementations§

Source§

impl<'index, Reader: Debug> Debug for Stream<'index, Reader>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'index, R: Read> Read for Stream<'index, R>

You can use Stream as a normal io::Read and recording index at the same time.

Source§

fn read(&mut self, buf: &mut [u8]) -> Result<usize>

Pull some bytes from this source into the specified buffer, returning how many bytes were read. Read more
1.36.0 · Source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
Source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored implementation. Read more
1.0.0 · Source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Reads all bytes until EOF in this source, placing them into buf. Read more
1.0.0 · Source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Reads all bytes until EOF in this source, appending them to buf. Read more
1.6.0 · Source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Reads the exact number of bytes required to fill buf. Read more
Source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
Source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Reads the exact number of bytes required to fill cursor. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adapter for this instance of Read. Read more
1.0.0 · Source§

fn bytes(self) -> Bytes<Self>
where Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · Source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where R: Read, Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · Source§

fn take(self, limit: u64) -> Take<Self>
where Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more
Source§

fn read_array<const N: usize>(&mut self) -> Result<[u8; N], Error>
where Self: Sized,

🔬This is a nightly-only experimental API. (read_array)
Read and return a fixed array of bytes from this source. Read more

Auto Trait Implementations§

§

impl<'index, Reader> Freeze for Stream<'index, Reader>
where Reader: Freeze,

§

impl<'index, Reader> RefUnwindSafe for Stream<'index, Reader>
where Reader: RefUnwindSafe,

§

impl<'index, Reader> Send for Stream<'index, Reader>
where Reader: Send,

§

impl<'index, Reader> Sync for Stream<'index, Reader>
where Reader: Sync,

§

impl<'index, Reader> Unpin for Stream<'index, Reader>
where Reader: Unpin,

§

impl<'index, Reader> UnsafeUnpin for Stream<'index, Reader>
where Reader: UnsafeUnpin,

§

impl<'index, Reader> !UnwindSafe for Stream<'index, Reader>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.