enum StderrReaderState {
    RequestingNextFrame {
        write_state: U64WriteState,
    },
    RequestingFrameLen {
        write_state: U64WriteState,
    },
    FrameLenRequested,
    ReadingSize {
        buf: [u8; 8],
        filled: usize,
    },
    ReadingPayload {
        remaining: u64,
        pad: usize,
        tmp_buf: BytesMut,
    },
}
Expand description

State machine for StderrReadFramedReader.

As the reader progresses it linearly cycles through the states.

Variants§

§

RequestingNextFrame

Represents the state indicating that we are about to request a new frame.

When poll_read is called, it writes STDERR_READ into the writer and progresses to the StderrReaderState::RequestingFrameLen state

The reader always starts in this state and is reached after every frame has been fully read.

Fields

§write_state: U64WriteState
§

RequestingFrameLen

At this point the reader writes the desired payload length we want to receive based on read_buf.remaining().

Fields

§write_state: U64WriteState
§

FrameLenRequested

At this point the reader just flushes the writer and gets ready to receive the actual payload size that is about to be sent to us by transitioning to the StderrReaderState::ReadingSize state.

§

ReadingSize

The size is a u64 which is 8 bytes long, while it’s likely that we will receive the whole u64 in one read, it’s possible that it will arrive in smaller chunks. So in this state we read up to 8 bytes and transition to StderrReaderState::ReadingPayload when done.

Fields

§buf: [u8; 8]
§filled: usize
§

ReadingPayload

This is where we read the actual payload that is sent to us. All of the previous states were just internal bookkeeping where we did not return any data to the conumer, and only returned Poll::Pending.

Having read the full payload, progresses to the StderrReaderState::RequestingNextFrame state to read the next frame when/if requested.

Fields

§remaining: u64

Represents the remaining number of bytes we expect to read based on the value read in the previous state.

§pad: usize

Represents the remaining of padding we expect to read before switching back to the RequestingNextFrame state.

§tmp_buf: BytesMut

In an ideal case this reader does not allocate, but in the scenario where we’ve read the whol payload frame but still have padding remaining, it’s not safe to return the payload to the consumer as there is risk that the reader won’t be called again, leaving dangling padding. In this case we store the payload in this buffer until we’ve read the padding, and then return the data from here.

Implementations§

Trait Implementations§

source§

impl Debug for StderrReaderState

source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

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> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. 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> Same for T

source§

type Output = T

Should always be Self
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.
source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more