pub struct Stateful<I, S> {
pub input: I,
pub state: S,
}
Expand description
Thread global state through your parsers
Use cases
- Recursion checks
- Error recovery
- Debugging
§Example
#[derive(Debug)]
struct State<'s>(&'s mut u32);
impl<'s> State<'s> {
fn count(&mut self) {
*self.0 += 1;
}
}
type Stream<'is> = Stateful<&'is str, State<'is>>;
fn word<'s>(i: &mut Stream<'s>) -> PResult<&'s str> {
i.state.count();
alpha1.parse_next(i)
}
let data = "Hello";
let mut state = 0;
let input = Stream { input: data, state: State(&mut state) };
let output = word.parse(input).unwrap();
assert_eq!(state, 1);
Fields§
§input: I
Inner input being wrapped in state
state: S
User-provided state
Trait Implementations§
Source§impl<I, S, U> Compare<U> for Stateful<I, S>where
I: Compare<U>,
impl<I, S, U> Compare<U> for Stateful<I, S>where
I: Compare<U>,
Source§fn compare(&self, other: U) -> CompareResult
fn compare(&self, other: U) -> CompareResult
Compares self to another value for equality
Source§impl<I, S> Offset<<Stateful<I, S> as Stream>::Checkpoint> for Stateful<I, S>
impl<I, S> Offset<<Stateful<I, S> as Stream>::Checkpoint> for Stateful<I, S>
Source§fn offset_from(&self, other: &<Stateful<I, S> as Stream>::Checkpoint) -> usize
fn offset_from(&self, other: &<Stateful<I, S> as Stream>::Checkpoint) -> usize
Source§impl<I: Stream, S: Debug> Stream for Stateful<I, S>
impl<I: Stream, S: Debug> Stream for Stateful<I, S>
Source§type IterOffsets = <I as Stream>::IterOffsets
type IterOffsets = <I as Stream>::IterOffsets
Iterate with the offset from the current location
Source§type Checkpoint = Checkpoint<<I as Stream>::Checkpoint, Stateful<I, S>>
type Checkpoint = Checkpoint<<I as Stream>::Checkpoint, Stateful<I, S>>
A parse location within the stream
Source§fn iter_offsets(&self) -> Self::IterOffsets
fn iter_offsets(&self) -> Self::IterOffsets
Iterate with the offset from the current location
Source§fn eof_offset(&self) -> usize
fn eof_offset(&self) -> usize
Returns the offset to the end of the input
Source§fn next_token(&mut self) -> Option<Self::Token>
fn next_token(&mut self) -> Option<Self::Token>
Split off the next token from the input
Source§fn offset_for<P>(&self, predicate: P) -> Option<usize>
fn offset_for<P>(&self, predicate: P) -> Option<usize>
Finds the offset of the next matching token
Source§fn offset_at(&self, tokens: usize) -> Result<usize, Needed>
fn offset_at(&self, tokens: usize) -> Result<usize, Needed>
Get the offset for the number of
tokens
into the stream Read moreSource§fn next_slice(&mut self, offset: usize) -> Self::Slice
fn next_slice(&mut self, offset: usize) -> Self::Slice
Split off a slice of tokens from the input Read more
Source§fn checkpoint(&self) -> Self::Checkpoint
fn checkpoint(&self) -> Self::Checkpoint
Save the current parse location within the stream
Source§fn reset(&mut self, checkpoint: &Self::Checkpoint)
fn reset(&mut self, checkpoint: &Self::Checkpoint)
Revert the stream to a prior
Self::Checkpoint
Read moreSource§fn peek_token(&self) -> Option<(Self, Self::Token)>where
Self: Clone,
fn peek_token(&self) -> Option<(Self, Self::Token)>where
Self: Clone,
Split off the next token from the input
Source§fn peek_slice(&self, offset: usize) -> (Self, Self::Slice)where
Self: Clone,
fn peek_slice(&self, offset: usize) -> (Self, Self::Slice)where
Self: Clone,
Split off a slice of tokens from the input
Source§fn peek_finish(&self) -> (Self, Self::Slice)where
Self: Clone,
fn peek_finish(&self) -> (Self, Self::Slice)where
Self: Clone,
Advance to the end of the stream
Source§impl<I, S> StreamIsPartial for Stateful<I, S>where
I: StreamIsPartial,
impl<I, S> StreamIsPartial for Stateful<I, S>where
I: StreamIsPartial,
Source§type PartialState = <I as StreamIsPartial>::PartialState
type PartialState = <I as StreamIsPartial>::PartialState
Whether the stream is currently partial or complete
Source§fn complete(&mut self) -> Self::PartialState
fn complete(&mut self) -> Self::PartialState
Mark the stream is complete
Source§fn restore_partial(&mut self, state: Self::PartialState)
fn restore_partial(&mut self, state: Self::PartialState)
Restore the stream back to its previous state
Source§fn is_partial_supported() -> bool
fn is_partial_supported() -> bool
Report whether the
Stream
is can ever be incompleteSource§fn is_partial(&self) -> bool
fn is_partial(&self) -> bool
Report whether the
Stream
is currently incompleteSource§impl<I, S> UpdateSlice for Stateful<I, S>
impl<I, S> UpdateSlice for Stateful<I, S>
Source§fn update_slice(self, inner: Self::Slice) -> Self
fn update_slice(self, inner: Self::Slice) -> Self
Convert an
Output
type to be used as Stream
impl<I: Copy, S: Copy> Copy for Stateful<I, S>
impl<I: Eq, S: Eq> Eq for Stateful<I, S>
impl<I, S> StructuralPartialEq for Stateful<I, S>
Auto Trait Implementations§
impl<I, S> Freeze for Stateful<I, S>
impl<I, S> RefUnwindSafe for Stateful<I, S>where
I: RefUnwindSafe,
S: RefUnwindSafe,
impl<I, S> Send for Stateful<I, S>
impl<I, S> Sync for Stateful<I, S>
impl<I, S> Unpin for Stateful<I, S>
impl<I, S> UnwindSafe for Stateful<I, S>where
I: UnwindSafe,
S: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Layout§
Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.