pub struct DecoderReader<'e, E: Engine, R: Read> {
    engine: &'e E,
    inner: R,
    b64_buffer: [u8; 1024],
    b64_offset: usize,
    b64_len: usize,
    decoded_buffer: [u8; 3],
    decoded_offset: usize,
    decoded_len: usize,
    total_b64_decoded: 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]§b64_offset: usize§b64_len: usize§decoded_buffer: [u8; 3]§decoded_offset: usize§decoded_len: usize§total_b64_decoded: usize§padding_offset: Option<usize>

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.

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, Global>) -> 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 Selfwhere 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> RefUnwindSafe for DecoderReader<'e, E, R>where E: RefUnwindSafe, R: RefUnwindSafe,

§

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>where E: RefUnwindSafe, R: UnwindSafe,

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere 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 Twhere 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 Twhere 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 Twhere 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.