pub struct BufReaderLineWriter<Inner: HalfDuplex> { /* private fields */ }
Expand description

Wraps a reader and writer and buffers input and output to and from it, flushing the writer whenever a newline (0x0a, '\n') is detected on output.

The BufDuplexer struct wraps a reader and writer and buffers their input and output. But it only does this batched write when it goes out of scope, or when the internal buffer is full. Sometimes, you’d prefer to write each line as it’s completed, rather than the entire buffer at once. Enter BufReaderLineWriter. It does exactly that.

Like BufDuplexer, a BufReaderLineWriter’s buffer will also be flushed when the BufReaderLineWriter goes out of scope or when its internal buffer is full.

If there’s still a partial line in the buffer when the BufReaderLineWriter is dropped, it will flush those contents.

§Examples

We can use BufReaderLineWriter to write one line at a time, significantly reducing the number of actual writes to the file.

use char_device::CharDevice;
use io_streams::BufReaderLineWriter;
use std::fs;
use std::io::prelude::*;

fn main() -> std::io::Result<()> {
    let road_not_taken = b"I shall be telling this with a sigh
Somewhere ages and ages hence:
Two roads diverged in a wood, and I -
I took the one less traveled by,
And that has made all the difference.";

    let file = CharDevice::open("/dev/tty")?;
    let mut file = BufReaderLineWriter::new(file);

    file.write_all(b"I shall be telling this with a sigh")?;

    // No bytes are written until a newline is encountered (or
    // the internal buffer is filled).
    assert_eq!(fs::read_to_string("poem.txt")?, "");
    file.write_all(b"\n")?;
    assert_eq!(
        fs::read_to_string("poem.txt")?,
        "I shall be telling this with a sigh\n",
    );

    // Write the rest of the poem.
    file.write_all(
        b"Somewhere ages and ages hence:
Two roads diverged in a wood, and I -
I took the one less traveled by,
And that has made all the difference.",
    )?;

    // The last line of the poem doesn't end in a newline, so
    // we have to flush or drop the `BufReaderLineWriter` to finish
    // writing.
    file.flush()?;

    // Confirm the whole poem was written.
    assert_eq!(fs::read("poem.txt")?, &road_not_taken[..]);
    Ok(())
}

Implementations§

source§

impl<Inner: HalfDuplex> BufReaderLineWriter<Inner>

source

pub fn new(inner: Inner) -> Self

Creates a new BufReaderLineWriter.

§Examples
use char_device::CharDevice;
use io_streams::BufReaderLineWriter;

fn main() -> std::io::Result<()> {
    let file = CharDevice::open("/dev/tty")?;
    let file = BufReaderLineWriter::new(file);
    Ok(())
}
source

pub fn with_capacities( reader_capacity: usize, writer_capacity: usize, inner: Inner ) -> Self

Creates a new BufReaderLineWriter with a specified capacities for the internal buffers.

§Examples
use char_device::CharDevice;
use io_streams::BufReaderLineWriter;

fn main() -> std::io::Result<()> {
    let file = CharDevice::open("/dev/tty")?;
    let file = BufReaderLineWriter::with_capacities(10, 100, file);
    Ok(())
}
source

pub fn get_ref(&self) -> &Inner

Gets a reference to the underlying writer.

§Examples
use char_device::CharDevice;
use io_streams::BufReaderLineWriter;

fn main() -> std::io::Result<()> {
    let file = CharDevice::open("/dev/tty")?;
    let file = BufReaderLineWriter::new(file);

    let reference = file.get_ref();
    Ok(())
}
source

pub fn get_mut(&mut self) -> &mut Inner

Gets a mutable reference to the underlying writer.

Caution must be taken when calling methods on the mutable reference returned as extra writes could corrupt the output stream.

§Examples
use char_device::CharDevice;
use io_streams::BufReaderLineWriter;

fn main() -> std::io::Result<()> {
    let file = CharDevice::open("/dev/tty")?;
    let mut file = BufReaderLineWriter::new(file);

    // we can use reference just like file
    let reference = file.get_mut();
    Ok(())
}
source

pub fn into_inner(self) -> Result<Inner, IntoInnerError<Self>>

Unwraps this BufReaderLineWriter, returning the underlying writer.

The internal buffer is written out before returning the writer.

§Errors

An Err will be returned if an error occurs while flushing the buffer.

§Examples
use char_device::CharDevice;
use io_streams::BufReaderLineWriter;

fn main() -> std::io::Result<()> {
    let file = CharDevice::open("/dev/tty")?;

    let writer: BufReaderLineWriter<CharDevice> = BufReaderLineWriter::new(file);

    let file: CharDevice = writer.into_inner()?;
    Ok(())
}

Trait Implementations§

source§

impl<Inner: HalfDuplex + AsHandle> AsHandle for BufReaderLineWriter<Inner>

source§

fn as_handle(&self) -> BorrowedHandle<'_>

Borrows the handle. Read more
source§

impl<Inner: HalfDuplex + AsHandleOrSocket> AsHandleOrSocket for BufReaderLineWriter<Inner>

source§

impl<Inner: HalfDuplex + AsRawHandle> AsRawHandle for BufReaderLineWriter<Inner>

source§

fn as_raw_handle(&self) -> RawHandle

Extracts the raw handle. Read more
source§

impl<Inner: HalfDuplex + AsRawHandleOrSocket> AsRawHandleOrSocket for BufReaderLineWriter<Inner>

source§

impl<Inner: HalfDuplex + AsRawSocket> AsRawSocket for BufReaderLineWriter<Inner>

source§

fn as_raw_socket(&self) -> RawSocket

Extracts the raw socket. Read more
source§

impl<Inner: HalfDuplex + AsSocket> AsSocket for BufReaderLineWriter<Inner>

source§

fn as_socket(&self) -> BorrowedSocket<'_>

Borrows the socket.
source§

impl<Inner: HalfDuplex> BufRead for BufReaderLineWriter<Inner>

source§

fn fill_buf(&mut self) -> Result<&[u8]>

Returns the contents of the internal buffer, filling it with more data from the inner reader if it is empty. Read more
source§

fn consume(&mut self, amt: usize)

Tells this buffer that amt bytes have been consumed from the buffer, so they should no longer be returned in calls to read. Read more
source§

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

Read all bytes into buf until the delimiter byte or EOF is reached. Read more
source§

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

Read all bytes until a newline (the 0xA byte) is reached, and append them to the provided String buffer. Read more
source§

fn has_data_left(&mut self) -> Result<bool, Error>

🔬This is a nightly-only experimental API. (buf_read_has_data_left)
Check if the underlying Read has any data left to be read. Read more
source§

fn skip_until(&mut self, byte: u8) -> Result<usize, Error>

🔬This is a nightly-only experimental API. (bufread_skip_until)
Skip all bytes until the delimiter byte or EOF is reached. Read more
1.0.0 · source§

fn split(self, byte: u8) -> Split<Self>
where Self: Sized,

Returns an iterator over the contents of this reader split on the byte byte. Read more
1.0.0 · source§

fn lines(self) -> Lines<Self>
where Self: Sized,

Returns an iterator over the lines of this reader. Read more
source§

impl<Inner> Debug for BufReaderLineWriter<Inner>
where Inner: Debug + HalfDuplex,

source§

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

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

impl<Inner: HalfDuplex> Read for BufReaderLineWriter<Inner>

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
source§

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

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>

Read 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>

Read 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>

Read 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)
Read 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” adaptor 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§

impl<Inner: HalfDuplex> Write for BufReaderLineWriter<Inner>

source§

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

Write a buffer into this writer, returning how many bytes were written. Read more
source§

fn flush(&mut self) -> Result<()>

Flush this output stream, ensuring that all intermediately buffered contents reach their destination. Read more
source§

fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize>

Like write, except that it writes from a slice of buffers. Read more
source§

fn is_write_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Writer has an efficient write_vectored implementation. Read more
source§

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

Attempts to write an entire buffer into this writer. Read more
source§

fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>

🔬This is a nightly-only experimental API. (write_all_vectored)
Attempts to write multiple buffers into this writer. Read more
source§

fn write_fmt(&mut self, fmt: Arguments<'_>) -> Result<()>

Writes a formatted string into this writer, returning any error encountered. 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 Write. Read more

Auto Trait Implementations§

§

impl<Inner> Freeze for BufReaderLineWriter<Inner>
where Inner: Freeze,

§

impl<Inner> RefUnwindSafe for BufReaderLineWriter<Inner>
where Inner: RefUnwindSafe,

§

impl<Inner> Send for BufReaderLineWriter<Inner>
where Inner: Send,

§

impl<Inner> Sync for BufReaderLineWriter<Inner>
where Inner: Sync,

§

impl<Inner> Unpin for BufReaderLineWriter<Inner>
where Inner: Unpin,

§

impl<Inner> UnwindSafe for BufReaderLineWriter<Inner>
where Inner: UnwindSafe,

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> AsFilelike for T
where T: AsHandle,

source§

fn as_filelike(&self) -> BorrowedHandle<'_>

Borrows the reference. Read more
source§

fn as_filelike_view<Target>(&self) -> FilelikeView<'_, Target>
where Target: FilelikeViewType,

Return a borrowing view of a resource which dereferences to a &Target. Read more
source§

impl<T> AsGrip for T

source§

fn as_grip(&self) -> BorrowedHandleOrSocket<'_>

Extracts the grip.
source§

impl<T> AsRawFilelike for T
where T: AsRawHandle,

source§

fn as_raw_filelike(&self) -> *mut c_void

Returns the raw value.
source§

impl<T> AsRawGrip for T

source§

fn as_raw_grip(&self) -> RawHandleOrSocket

Extracts the raw grip.
source§

impl<T> AsRawSocketlike for T
where T: AsRawSocket,

source§

fn as_raw_socketlike(&self) -> u32

Returns the raw value.
source§

impl<T> AsSocketlike for T
where T: AsSocket,

source§

fn as_socketlike(&self) -> BorrowedSocket<'_>

Borrows the reference.
source§

fn as_socketlike_view<Target>(&self) -> SocketlikeView<'_, Target>
where Target: SocketlikeViewType,

Return a borrowing view of a resource which dereferences to a &Target. 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> GetSetFdFlags for T

source§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where T: AsFilelike,

Query the “status” flags for the self file descriptor.
source§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>

Create a new SetFdFlags value for use with set_fd_flags. Read more
source§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
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> SetTimes for T
where T: AsFilelike,

source§

fn set_times( &self, atime: Option<SystemTimeSpec>, mtime: Option<SystemTimeSpec> ) -> Result<(), Error>

Set the last access and last modification timestamps of an open file handle. Read more
source§

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

§

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>,

§

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.