Struct Partial
pub struct Partial<I> { /* private fields */ }
Available on crate feature
dep_winnow
only.Expand description
Mark the input as a partial buffer for streaming input.
Complete input means that we already have all of the data. This will be the common case with small files that can be read entirely to memory.
In contrast, streaming input assumes that we might not have all of the data. This can happen with some network protocol or large file parsers, where the input buffer can be full and need to be resized or refilled.
- [
ErrMode::Incomplete
] will report how much more data is needed. Parser::complete_err
transform [ErrMode::Incomplete
] to [ErrMode::Backtrack
]
See also StreamIsPartial
to tell whether the input supports complete or partial parsing.
See also [Special Topics: Parsing Partial Input][crate::_topic::partial].
§Example
Here is how it works in practice:
fn take_partial<'s>(i: &mut Partial<&'s [u8]>) -> PResult<&'s [u8], InputError<Partial<&'s [u8]>>> {
token::take(4u8).parse_next(i)
}
fn take_complete<'s>(i: &mut &'s [u8]) -> PResult<&'s [u8], InputError<&'s [u8]>> {
token::take(4u8).parse_next(i)
}
// both parsers will take 4 bytes as expected
assert_eq!(take_partial.parse_peek(Partial::new(&b"abcde"[..])), Ok((Partial::new(&b"e"[..]), &b"abcd"[..])));
assert_eq!(take_complete.parse_peek(&b"abcde"[..]), Ok((&b"e"[..], &b"abcd"[..])));
// if the input is smaller than 4 bytes, the partial parser
// will return `Incomplete` to indicate that we need more data
assert_eq!(take_partial.parse_peek(Partial::new(&b"abc"[..])), Err(ErrMode::Incomplete(Needed::new(1))));
// but the complete parser will return an error
assert_eq!(take_complete.parse_peek(&b"abc"[..]), Err(ErrMode::Backtrack(InputError::new(&b"abc"[..], ErrorKind::Slice))));
// the alpha0 function takes 0 or more alphabetic characters
fn alpha0_partial<'s>(i: &mut Partial<&'s str>) -> PResult<&'s str, InputError<Partial<&'s str>>> {
ascii::alpha0.parse_next(i)
}
fn alpha0_complete<'s>(i: &mut &'s str) -> PResult<&'s str, InputError<&'s str>> {
ascii::alpha0.parse_next(i)
}
// if there's a clear limit to the taken characters, both parsers work the same way
assert_eq!(alpha0_partial.parse_peek(Partial::new("abcd;")), Ok((Partial::new(";"), "abcd")));
assert_eq!(alpha0_complete.parse_peek("abcd;"), Ok((";", "abcd")));
// but when there's no limit, the partial version returns `Incomplete`, because it cannot
// know if more input data should be taken. The whole input could be "abcd;", or
// "abcde;"
assert_eq!(alpha0_partial.parse_peek(Partial::new("abcd")), Err(ErrMode::Incomplete(Needed::new(1))));
// while the complete version knows that all of the data is there
assert_eq!(alpha0_complete.parse_peek("abcd"), Ok(("", "abcd")));
Implementations§
§impl<I> Partial<I>where
I: StreamIsPartial,
impl<I> Partial<I>where
I: StreamIsPartial,
pub fn into_inner(self) -> I
pub fn into_inner(self) -> I
Extract the original Stream
Trait Implementations§
§impl<I, T> Compare<T> for Partial<I>where
I: Compare<T>,
impl<I, T> Compare<T> for Partial<I>where
I: Compare<T>,
§fn compare(&self, t: T) -> CompareResult
fn compare(&self, t: T) -> CompareResult
Compares self to another value for equality
§impl<I> Default for Partial<I>where
I: Default + StreamIsPartial,
impl<I> Default for Partial<I>where
I: Default + StreamIsPartial,
§impl<I> Offset<<Partial<I> as Stream>::Checkpoint> for Partial<I>where
I: Stream,
impl<I> Offset<<Partial<I> as Stream>::Checkpoint> for Partial<I>where
I: Stream,
§fn offset_from(&self, other: &<Partial<I> as Stream>::Checkpoint) -> usize ⓘ
fn offset_from(&self, other: &<Partial<I> as Stream>::Checkpoint) -> usize ⓘ
§impl<I> Ord for Partial<I>where
I: Ord,
impl<I> Ord for Partial<I>where
I: Ord,
§impl<I> PartialOrd for Partial<I>where
I: PartialOrd,
impl<I> PartialOrd for Partial<I>where
I: PartialOrd,
§impl<I> Stream for Partial<I>where
I: Stream,
impl<I> Stream for Partial<I>where
I: Stream,
§type IterOffsets = <I as Stream>::IterOffsets
type IterOffsets = <I as Stream>::IterOffsets
Iterate with the offset from the current location
§type Checkpoint = Checkpoint<<I as Stream>::Checkpoint, Partial<I>>
type Checkpoint = Checkpoint<<I as Stream>::Checkpoint, Partial<I>>
A parse location within the stream
§fn iter_offsets(&self) -> <Partial<I> as Stream>::IterOffsets
fn iter_offsets(&self) -> <Partial<I> as Stream>::IterOffsets
Iterate with the offset from the current location
§fn eof_offset(&self) -> usize ⓘ
fn eof_offset(&self) -> usize ⓘ
Returns the offset to the end of the input
§fn next_token(&mut self) -> Option<<Partial<I> as Stream>::Token> ⓘ
fn next_token(&mut self) -> Option<<Partial<I> as Stream>::Token> ⓘ
Split off the next token from the input
§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
§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 more§fn next_slice(&mut self, offset: usize) -> <Partial<I> as Stream>::Slice
fn next_slice(&mut self, offset: usize) -> <Partial<I> as Stream>::Slice
Split off a slice of tokens from the input Read more
§fn checkpoint(&self) -> <Partial<I> as Stream>::Checkpoint
fn checkpoint(&self) -> <Partial<I> as Stream>::Checkpoint
Save the current parse location within the stream
§fn reset(&mut self, checkpoint: &<Partial<I> as Stream>::Checkpoint)
fn reset(&mut self, checkpoint: &<Partial<I> as Stream>::Checkpoint)
Revert the stream to a prior
Self::Checkpoint
Read more§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
§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
§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
§impl<I> StreamIsPartial for Partial<I>where
I: StreamIsPartial,
impl<I> StreamIsPartial for Partial<I>where
I: StreamIsPartial,
§type PartialState = bool
type PartialState = bool
Whether the stream is currently partial or complete
§fn complete(&mut self) -> <Partial<I> as StreamIsPartial>::PartialState
fn complete(&mut self) -> <Partial<I> as StreamIsPartial>::PartialState
Mark the stream is complete
§fn restore_partial(
&mut self,
state: <Partial<I> as StreamIsPartial>::PartialState,
)
fn restore_partial( &mut self, state: <Partial<I> as StreamIsPartial>::PartialState, )
Restore the stream back to its previous state
§fn is_partial_supported() -> bool
fn is_partial_supported() -> bool
Report whether the
Stream
is can ever be incomplete§fn is_partial(&self) -> bool
fn is_partial(&self) -> bool
Report whether the
Stream
is currently incomplete§impl<I> UpdateSlice for Partial<I>where
I: UpdateSlice,
impl<I> UpdateSlice for Partial<I>where
I: UpdateSlice,
impl<I> Copy for Partial<I>where
I: Copy,
impl<I> Eq for Partial<I>where
I: Eq,
impl<I> StructuralPartialEq for Partial<I>
Auto Trait Implementations§
impl<I> Freeze for Partial<I>where
I: Freeze,
impl<I> RefUnwindSafe for Partial<I>where
I: RefUnwindSafe,
impl<I> Send for Partial<I>where
I: Send,
impl<I> Sync for Partial<I>where
I: Sync,
impl<I> Unpin for Partial<I>where
I: Unpin,
impl<I> UnwindSafe for Partial<I>where
I: UnwindSafe,
Blanket Implementations§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
The archived version of the pointer metadata for this type.
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Converts some archived metadata to the pointer metadata for itself.
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> ByteSized for T
impl<T> ByteSized for T
Source§const BYTE_ALIGN: usize = _
const BYTE_ALIGN: usize = _
The alignment of this type in bytes.
Source§fn byte_align(&self) -> usize ⓘ
fn byte_align(&self) -> usize ⓘ
Returns the alignment of this type in bytes.
Source§fn ptr_size_ratio(&self) -> [usize; 2]
fn ptr_size_ratio(&self) -> [usize; 2]
Source§impl<T, R> Chain<R> for Twhere
T: ?Sized,
impl<T, R> Chain<R> for Twhere
T: ?Sized,
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Compare self to
key
and return true
if they are equal.Source§impl<T> ExtAny for T
impl<T> ExtAny for T
Source§fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
Source§impl<T> ExtMem for Twhere
T: ?Sized,
impl<T> ExtMem for Twhere
T: ?Sized,
Source§const NEEDS_DROP: bool = _
const NEEDS_DROP: bool = _
Know whether dropping values of this type matters, in compile-time.
Source§fn mem_align_of_val(&self) -> usize ⓘ
fn mem_align_of_val(&self) -> usize ⓘ
Returns the alignment of the pointed-to value in bytes. Read more
Source§fn mem_size_of_val(&self) -> usize ⓘ
fn mem_size_of_val(&self) -> usize ⓘ
Returns the size of the pointed-to value in bytes. Read more
Source§fn mem_needs_drop(&self) -> bool
fn mem_needs_drop(&self) -> bool
Returns
true
if dropping values of this type matters. Read moreSource§fn mem_forget(self)where
Self: Sized,
fn mem_forget(self)where
Self: Sized,
Forgets about
self
without running its destructor. Read moreSource§fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
Source§unsafe fn mem_zeroed<T>() -> T
unsafe fn mem_zeroed<T>() -> T
Available on crate feature
unsafe_layout
only.Returns the value of type
T
represented by the all-zero byte-pattern. Read moreSource§unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
Available on crate feature
unsafe_layout
only.Returns the value of type
T
represented by the all-zero byte-pattern. Read moreSource§fn mem_as_bytes(&self) -> &[u8] ⓘ
fn mem_as_bytes(&self) -> &[u8] ⓘ
Available on crate feature
unsafe_slice
only.§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> Hook for T
impl<T> Hook for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
Returns the layout of the type.
§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Returns whether the given value has been niched. Read more
§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
Writes data to
out
indicating that a T
is niched.