Struct base64::read::decoder::DecoderReader

source ·
pub struct DecoderReader<'e, E: Engine, R: Read> {
    engine: &'e E,
    inner: R,
    b64_buffer: [u8; 1024],
    b64_offset: usize,
    b64_len: usize,
    decoded_chunk_buffer: [u8; 3],
    decoded_offset: usize,
    decoded_len: usize,
    input_consumed_len: usize,
    padding_offset: Option<usize>,
}
Expand description

A Read implementation that decodes base64 data read from an underlying reader.

§Examples

use std::io::Read;
use std::io::Cursor;
use base64::engine::general_purpose;

// use a cursor as the simplest possible `Read` -- in real code this is probably a file, etc.
let mut wrapped_reader = Cursor::new(b"YXNkZg==");
let mut decoder = base64::read::DecoderReader::new(
    &mut wrapped_reader,
    &general_purpose::STANDARD);

// handle errors as you normally would
let mut result = Vec::new();
decoder.read_to_end(&mut result).unwrap();

assert_eq!(b"asdf", &result[..]);

Fields§

§engine: &'e E§inner: R

Where b64 data is read from

§b64_buffer: [u8; 1024]

Holds b64 data read from the delegate reader.

§b64_offset: usize

The start of the pending buffered data in b64_buffer.

§b64_len: usize

The amount of buffered b64 data after b64_offset in b64_len.

§decoded_chunk_buffer: [u8; 3]

Since the caller may provide us with a buffer of size 1 or 2 that’s too small to copy a decoded chunk in to, we have to be able to hang on to a few decoded bytes. Technically we only need to hold 2 bytes, but then we’d need a separate temporary buffer to decode 3 bytes into and then juggle copying one byte into the provided read buf and the rest into here, which seems like a lot of complexity for 1 extra byte of storage.

§decoded_offset: usize

Index of start of decoded data in decoded_chunk_buffer

§decoded_len: usize

Length of decoded data after decoded_offset in decoded_chunk_buffer

§input_consumed_len: usize

Input length consumed so far. Used to provide accurate offsets in errors

§padding_offset: Option<usize>

offset of previously seen padding, if any

Implementations§

source§

impl<'e, E: Engine, R: Read> DecoderReader<'e, E, R>

source

pub fn new(reader: R, engine: &'e E) -> Self

Create a new decoder that will read from the provided reader r.

source

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

Write as much as possible of the decoded buffer into the target buffer. Must only be called when there is something to write and space to write into. Returns a Result with the number of (decoded) bytes copied.

source

fn read_from_delegate(&mut self) -> Result<usize>

Read into the remaining space in the buffer after the current contents. Must only be called when there is space to read into in the buffer. Returns the number of bytes read.

source

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

Decode the requested number of bytes from the b64 buffer into the provided buffer. It’s the caller’s responsibility to choose the number of b64 bytes to decode correctly.

Returns a Result with the number of decoded bytes written to buf.

§Panics

panics if buf is too small

source

pub fn into_inner(self) -> R

Unwraps this DecoderReader, returning the base reader which it reads base64 encoded input from.

Because DecoderReader performs internal buffering, the state of the inner reader is unspecified. This function is mainly provided because the inner reader type may provide additional functionality beyond the Read implementation which may still be useful.

Trait Implementations§

source§

impl<'e, E: Engine, R: Read> Debug for DecoderReader<'e, E, R>

source§

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

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

impl<'e, E: Engine, R: Read> Read for DecoderReader<'e, E, R>

source§

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

Decode input from the wrapped reader.

Under non-error circumstances, this returns Ok with the value being the number of bytes written in buf.

Where possible, this function buffers base64 to minimize the number of read() calls to the delegate reader.

§Errors

Any errors emitted by the delegate reader are returned. Decoding errors due to invalid base64 are also possible, and will have io::ErrorKind::InvalidData.

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

Auto Trait Implementations§

§

impl<'e, E, R> Freeze for DecoderReader<'e, E, R>
where R: Freeze,

§

impl<'e, E, R> RefUnwindSafe for DecoderReader<'e, E, R>

§

impl<'e, E, R> Send for DecoderReader<'e, E, R>
where R: Send,

§

impl<'e, E, R> Sync for DecoderReader<'e, E, R>
where R: Sync,

§

impl<'e, E, R> Unpin for DecoderReader<'e, E, R>
where R: Unpin,

§

impl<'e, E, R> UnwindSafe for DecoderReader<'e, E, R>

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.