pub struct EncoderWriter<'e, E: Engine, W: Write> { /* private fields */ }
Expand description
A Write
implementation that base64 encodes data before delegating to the wrapped writer.
Because base64 has special handling for the end of the input data (padding, etc), there’s a
finish()
method on this type that encodes any leftover input bytes and adds padding if
appropriate. It’s called automatically when deallocated (see the Drop
implementation), but
any error that occurs when invoking the underlying writer will be suppressed. If you want to
handle such errors, call finish()
yourself.
§Examples
use std::io::Write;
use base64::engine::general_purpose;
// use a vec as the simplest possible `Write` -- in real code this is probably a file, etc.
let mut enc = base64::write::EncoderWriter::new(Vec::new(), &general_purpose::STANDARD);
// handle errors as you normally would
enc.write_all(b"asdf").unwrap();
// could leave this out to be called by Drop, if you don't care
// about handling errors or getting the delegate writer back
let delegate = enc.finish().unwrap();
// base64 was written to the writer
assert_eq!(b"YXNkZg==", &delegate[..]);
§Panics
Calling write()
(or related methods) or finish()
after finish()
has completed without
error is invalid and will panic.
§Errors
Base64 encoding itself does not generate errors, but errors from the wrapped writer will be
returned as per the contract of Write
.
§Performance
It has some minor performance loss compared to encoding slices (a couple percent). It does not do any heap allocation.
§Limitations
Owing to the specification of the write
and flush
methods on the Write
trait and their
implications for a buffering implementation, these methods may not behave as expected. In
particular, calling write_all
on this interface may fail with io::ErrorKind::WriteZero
.
See the documentation of the Write
trait implementation for further details.
Implementations§
Source§impl<'e, E: Engine, W: Write> EncoderWriter<'e, E, W>
impl<'e, E: Engine, W: Write> EncoderWriter<'e, E, W>
Sourcepub fn new(delegate: W, engine: &'e E) -> EncoderWriter<'e, E, W> ⓘ
pub fn new(delegate: W, engine: &'e E) -> EncoderWriter<'e, E, W> ⓘ
Create a new encoder that will write to the provided delegate writer.
Sourcepub fn finish(&mut self) -> Result<W>
pub fn finish(&mut self) -> Result<W>
Encode all remaining buffered data and write it, including any trailing incomplete input triples and associated padding.
Once this succeeds, no further writes or calls to this method are allowed.
This may write to the delegate writer multiple times if the delegate writer does not accept
all input provided to its write
each invocation.
If you don’t care about error handling, it is not necessary to call this function, as the equivalent finalization is done by the Drop impl.
Returns the writer that this was constructed around.
§Errors
The first error that is not of ErrorKind::Interrupted
will be returned.
Sourcepub fn into_inner(self) -> W
pub fn into_inner(self) -> W
Unwraps this EncoderWriter
, returning the base writer it writes base64 encoded output
to.
Normally this method should not be needed, since finish()
returns the inner writer if
it completes successfully. That will also ensure all data has been flushed, which the
into_inner()
function does not do.
Calling this method after finish()
has completed successfully will panic, since the
writer has already been returned.
This method may be useful if the writer implements additional APIs beyond the Write
trait. Note that the inner writer might be in an error state or have an incomplete
base64 string written to it.
Trait Implementations§
Source§impl<'e, E: Engine, W: Write> Write for EncoderWriter<'e, E, W>
impl<'e, E: Engine, W: Write> Write for EncoderWriter<'e, E, W>
Source§fn write(&mut self, input: &[u8]) -> Result<usize>
fn write(&mut self, input: &[u8]) -> Result<usize>
Encode input and then write to the delegate writer.
Under non-error circumstances, this returns Ok
with the value being the number of bytes
of input
consumed. The value may be 0
, which interacts poorly with write_all
, which
interprets Ok(0)
as an error, despite it being allowed by the contract of write
. See
https://github.com/rust-lang/rust/issues/56889 for more on that.
If the previous call to write
provided more (encoded) data than the delegate writer could
accept in a single call to its write
, the remaining data is buffered. As long as buffered
data is present, subsequent calls to write
will try to write the remaining buffered data
to the delegate and return either Ok(0)
– and therefore not consume any of input
– or
an error.
§Errors
Any errors emitted by the delegate writer are returned.
Source§fn flush(&mut self) -> Result<()>
fn flush(&mut self) -> Result<()>
Because this is usually treated as OK to call multiple times, it will not flush any incomplete chunks of input or write padding.
§Errors
The first error that is not of ErrorKind::Interrupted
will be returned.
Source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
can_vector
)1.0.0 · Source§fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
Source§fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
write_all_vectored
)